我试图为一个矩阵表建立一个查询,该表的模式是这样的。
X | Y | Z | Disabled | OccupiedId |
--------------------------------------------
1 1 1 0 NULL
1 2 1 0 NULL
1 3 1 1 NULL
1 4 1 0 1
1 5 1 0 2
1 6 1 0 3
1 7 1 0 4
1 1 2 0 NULL
1 2 2 0 NULL
1 3 2 0 NULL
1 4 2 0 NULL
1 5 2 0 NULL
1 6 2 0 NULL
1 7 2 0 NULL
我想对X、Z进行分组,并在Y上找到第一个可用的位置。
可用的意思是指非禁用和非占用。
在所提供的例子中,这个查询应该返回。
X | Z | FreeY
--------------------------------------------
1 1 2
1 2 7
考虑到每个(X, Z)都是从末端开始填充的(MAX Y是常数),该查询应该选择第一个空闲的Y(或最后一个被占用的Y)。
我尝试了不同的方法,但都不成功:(
非常感谢任何建议!
敬请关注。
SQL的忽悠
CREATE TABLE Coordinate ( X int, Y int,Z int, Disabled bit, OccupiedId int) INSERT INTO Coordinate VALUES (1,1,1, 1, NULL) INSERT INTO Coordinate VALUES (1,1,2, 0, NULL) INSERT INTO Coordinate VALUES (1,1,3, 0, NULL) INSERT INTO Coordinate VALUES (1,1,4, 0, NULL) INSERT INTO Coordinate VALUES (1,2,1, 0, NULL) INSERT INTO Coordinate VALUES (1,2,2, 0, NULL) INSERT INTO Coordinate VALUES (1,2,3, 0, 123) INSERT INTO Coordinate VALUES (1,2,4, 0, NULL) INSERT INTO Coordinate VALUES (1,2,5, 1, NULL) SELECT X, Z, MIN(Y) AS FirstFreePosition FROM Coordinate WHERE Disabled = 0 AND OccupiedId IS NULL GROUP BY X, Z OR -- if you need the unavailable combinations too, then something like this: SELECT X, Z, MIN(CASE WHEN Disabled = 1 OR OccupiedId IS NOT NULL THEN 1000 --a big number ELSE Y END) AS FirstFreePosition FROM Coordinate GROUP BY X, Z