相关文章推荐
逼格高的沙发  ·  WordPress 表单插件 - ...·  10 月前    · 
逼格高的沙发  ·  @types/codemirror@5.60 ...·  10 月前    · 
逼格高的沙发  ·  OpenCVSharp异常--OpenCVS ...·  11 月前    · 
逼格高的沙发  ·  Solved: Certificate ...·  11 月前    · 
逼格高的沙发  ·  PostgreSQL: The ...·  11 月前    · 
俊逸的炒饭  ·  自訂日期格式 - Tableau·  昨天    · 
长情的充电器  ·  TypeScript+Vue3 - Allis ·  昨天    · 
暴躁的电影票  ·  js循环map ...·  昨天    · 
文雅的弓箭  ·  js循环获取input · ...·  昨天    · 

T-SQL查询一个矩阵表的自由位置

1 人关注

我试图为一个矩阵表建立一个查询,该表的模式是这样的。

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)。

我尝试了不同的方法,但都不成功:( 非常感谢任何建议! 敬请关注。

4 个评论
请发表你的尝试
为什么 1, 3 行= 2
Dan
对不起,我还在编辑这个例子,因为它不清楚...
Dan
这是我的尝试:SELECT X, Z, COUNT(*) AS LastY FROM Matrix m LEFT OUTER JOIN Occupied ON Matrix.OccupiedId = Occupied.OccupiedId WHERE Y <=(SELECT TOP 1 Position FROM Matrix m1 WHERE m1.Z = m.z AND m1.X = m.X AND Disabled = 1 ORDER BY Y) GROUP BY X, Z ORDER BY X, Z
sql
sql-server
sql-server-2008
tsql
Dan
Dan
发布于 2012-11-13
2 个回答
András Ottó
András Ottó
发布于 2012-11-13
0 人赞同

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
RichardTheKiwi
RichardTheKiwi
发布于 2012-11-13
已采纳
0 人赞同

对于你的编辑(disabled=bit列),这个查询显示lastOccupiedID以及firstFreeY

 select x, z,
         max(case when disabled=1 or occupiedid is not null
then Y else 0 end) lastOccupiedPosition,
         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;
SQL 钓鱼台

MS SQL Server 2008模式设置

create table matrix(
X int  , Y int  , Z int  , Disabled varchar(5)  , OccupiedId int );
insert matrix values
(1    , 1   , 1   , 'True'       , NULL      ),
(1    , 1   , 2   , 'False'      , NULL      ),
(1    , 1   , 3   , 'False'      , NULL      ),
(1    , 1   , 4   , 'False'      , NULL      ),
(1    , 2   , 1   , 'False'      , NULL      ),
(1    , 2   , 2   , 'False'      , NULL      ),
(1    , 2   , 3   , 'False'      , 123       ),
(1    , 2   , 4   , 'False'      , NULL      );

查询1

 select x, z,
         max(case when disabled='true' or occupiedid is not null
then Y else 0 end) lastOccupiedPosition
    from matrix
group by x, z
order by x, z
| X | Z | LASTOCCUPIEDPOSITION |
--------------------------------
 
推荐文章