2009-04-09 31 views
9

Đối với dữ liệu sau đây:Chọn tất cả các hàng cho đến khi xuất hiện đầu tiên của giá trị nhất định

ngày | giá trị | kiểm tra
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005 | 5 | 0
2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

tôi cần phải chọn tất cả các hàng từ năm 2009 trở lại cho đến khi xuất hiện đầu tiên từ 0 trong cột kiểm tra:

ngày | giá trị | kiểm tra
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

Tôi đã thử với chức năng trễ, nhưng tôi chỉ có thể kiểm tra lại một tháng.

Tôi đang làm việc trên Oracle 10g.

Cảm ơn bạn trước,

UPDATE:

Tất cả dường như làm việc tốt, tập hợp dữ liệu thử nghiệm của tôi là quá nhỏ để nói bất cứ điều gì về sự khác biệt hiệu suất. Cảm ơn tất cả các yếu tố đầu vào của bạn!

Trả lời

12
SELECT * FROM mytable where date > (
    SELECT max(date) FROM mytable where check = 0  
) 
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 

hoặc thậm chí tốt hơn:

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 

Truy vấn sau này sẽ thực sự dừng quét ngay sau khi nó gặp số không đầu tiên trong tầm kiểm soát.

+0

này sẽ chỉ "dừng quét" nếu ORDER nội THEO được thỏa mãn bằng một chỉ số, trong trường hợp này bạn cũng có thể sử dụng phiên bản đầu tiên. Nếu không, Oracle sẽ sắp xếp toàn bộ kết quả bên trong. –

+0

Chắc chắn nó sẽ. Nhưng giải pháp này chỉ cần một chỉ mục vào ngày (ngày) để làm việc hiệu quả, trong khi giải pháp MAX() cũng cần một chỉ mục (kiểm tra, ngày tháng). – Quassnoi

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) 
+0

Không chắc chắn rằng 'DECLARE @mytable TABLE' sẽ hoạt động trong Oracle :) – Quassnoi

+0

lol. thói quen cũ ... –

Các vấn đề liên quan