sql - T-SQL 查询用作 LIFO 的矩阵表

标签 sql sql-server sql-server-2008 t-sql

按照我的[问题]:T-SQL Query a matrix table for free position 我现在尝试将我的矩阵表作为后进先出的方式处理。每对 (X,Z) 代表一个可以存储元素的 channel 。当我生成位置时,我现在使用上述问题和下面提供的查询。

SELECT x, z, MAX(CASE WHEN disabled = 0 AND occupiedId IS NULL THEN Y ELSE 0 END) firstFreeY
FROM matrix
GROUP BY x, z
ORDER BY x, z;

这是有效的,但它不能处理“漏洞”。事实上,有可能从表中删除禁用标志或手动删除元素。

如果我的矩阵表如下所示:

X   Z   Y   Disabled    OccupiedId
--------------------------------------------------
1   1   1   0   591
1   1   2   0   NULL
1   1   3   1   NULL
1   1   4   0   524
1   1   5   0   523
1   1   6   0   522
1   1   7   0   484
1   2   1   0   NULL
1   2   2   0   NULL
1   2   3   0   NULL
1   2   4   0   NULL
1   2   5   0   NULL
1   2   6   0   589
1   2   7   0   592 

上述查询的结果是:

X   Z   firstFreeY
------------------------
1   1   2
1   2   5

而不是:

X   Y   firstFreeY
------------------------
1   1   0
1   2   5

关于如何实现这一目标有什么建议吗?

最佳答案

此查询查找小于所有其他占用的 Y 的最大 Y:

select  m1.X
,       m1.Z
,       max(
        case
        when m2.MinOccupiedY is null or m1.Y < m2.MinOccupiedY then m1.Y
        else 0
        end
        ) as FirstFreeY
from    matrix m1
join    (
        select  X
        ,       Z
        ,       min(
                case 
                when disabled <> 0 or occupiedId is not null then Y
                end
                ) as MinOccupiedY
        from    matrix 
        group by
                X
        ,       Z
        ) m2
on      m1.X = m2.X
        and m1.Z = m2.Z
group by
        m1.X
,       m1.Z

Live example at SQL Fiddle.

关于sql - T-SQL 查询用作 LIFO 的矩阵表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376456/

相关文章:

sql-server-2008 - 为什么Sql Server建议在索引已经存在的情况下创建索引?

sql - 从字符串列名sql中获取列值

php - 选择字段内包含用户 ID 的 mysql 行

mysql - 无法比较日期

sql - 更新查询错误 : Incorrect syntax near '='

c# - 使用不同的凭据运行 NUnit 集成测试

sql-server - 删除允许空复选框,要求重新创建表

sql - 创建规则来限制sql server表中的特殊字符

php将mysql数据解析为多维json数组

sql - 按sql中的聚合值排序