以下数据:
日期|值|检查
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005年| 5 | 0
2004年| 5 | 1
2003年| 5 | 1
2002 | 5 | 1
我需要从2009年开始选择所有行,直到检查列中第一次出现0:
日期|值|检查
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
我尝试使用滞后功能,但我只能在一个月前检查。
我正在研究Oracle 10g。
更新:
所有似乎都运行良好,我的测试数据集太小,无法说出性能差异。
答案 0 :(得分:13)
SELECT * FROM mytable where date > (
SELECT max(date) FROM mytable where check = 0
)
答案 1 :(得分:3)
SELECT *
FROM (
SELECT m.*,
MIN(CASE WHEN check = 0 THEN 0 ELSE 1 END) OVER (ORDER BY date DESC)) AS mn
FROM mytable
)
WHERE mn = 1
甚至更好:
SELECT *
FROM (
SELECT m.*, ROW_NUMBER() OVER (ORDER BY mydate DESC) AS rn
FROM mytable m
ORDER BY
mydate DESC
)
WHERE rownum = DECODE(check, 0, NULL, rn)
ORDER BY
mydate DESC
后一个查询实际上会在遇到第一个检查零时立即停止扫描。
答案 2 :(得分:1)
DECLARE @mytable TABLE (date integer, [value] integer, [check] integer)
INSERT INTO @mytable VALUES (2009, 5, 1)
INSERT INTO @mytable VALUES (2008, 5, 1)
INSERT INTO @mytable VALUES (2007, 5, 1)
INSERT INTO @mytable VALUES (2006, 5, 0)
INSERT INTO @mytable VALUES (2005, 5, 0)
INSERT INTO @mytable VALUES (2004, 5, 1)
INSERT INTO @mytable VALUES (2003, 5, 1)
INSERT INTO @mytable VALUES (2002, 5, 1)
SELECT *
FROM @mytable
WHERE date > (SELECT MAX(date) FROM @mytable WHERE [Check] = 0)