gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:24:18 26 4
gpt4 key购买 nike

关注我的[问题]:T-SQL Query a matrix table for free position
我现在试图将我的矩阵表作为 LIFO 处理。每对 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com