我有一个要求,要找到一个部分的当前运作。我必须从complete (1)或0的列表操作状态中获取此信息。因此,该表通常看起来如下:
ID Operation Status
1 100 1
2 200 1
3 250 1
4 300 0
5 350 0因此,在本例中,操作300是我使用MIN(运算)获得的当前操作,其中的状态= 0。
但是,出现了一些跳过一些操作的情况,这些操作看起来如下:
ID Operation Status
1 100 1
2 200 0
3 250 1
4 300 0
5 350 0因此,在这种情况下,当前的操作仍然是操作300,但MIN(操作)不能工作。我需要的是行的第一次出现,其中的状态=0,在最后一次出现状态=1行之后。我怎样才能做到这一点?
编辑:还必须考虑所有操作状态为0的情况,其中正确的结果将是第一行(操作100)
发布于 2021-03-04 21:20:00
这将使您可以使用整个行:
DECLARE @MyTable TABLE (
ID INT,
Operation INT,
Status BIT
);
INSERT INTO @MyTable VALUES
(1, 100, 1)
,(2, 200, 0)
,(3, 250, 1)
,(4, 300, 0)
,(5, 350, 0)
;
WITH MaxOperation AS (
SELECT MAX(x.Operation) AS MaxOperation
FROM @MyTable x
WHERE x.Status = 1
)
SELECT TOP 1 t.*
FROM @MyTable t
CROSS APPLY (SELECT MaxOperation FROM MaxOperation) x
WHERE t.Operation > x.MaxOperation
OR x.MaxOperation IS NULL
ORDER BY t.Operation这将导致:
ID Operation Status
----------- ----------- ------
4 300 0如果所有的Status值都是0,它也会产生这种情况。
ID Operation Status
----------- ----------- ------
1 100 0发布于 2021-03-04 21:17:50
我确信有一种聪明的窗口函数方法可以做到这一点,但是在普通的sql中,这是一个想法。
SELECT MIN(Operation)
FROM SOME_TABLE
WHERE Operation >
( SELECT MAX(Operation)
FROM SOME_TABLE
WHERE status = 1
)发布于 2021-03-04 21:25:14
正如用户Error_2646所指出的,一种很好的方法是
select
min(ID)
from
[YourTable]
where
ID > (select max(ID) from [YourTable] where Status = 1)https://stackoverflow.com/questions/66482674
复制相似问题