按照我的[问题]: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
关于sql - T-SQL 查询用作 LIFO 的矩阵表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376456/