2013-05-03 115 views
2

考慮下面的表結構如何選擇SQL中的組內的某個記錄後的所有記錄?

Col1, Col2, EventType, DateTime 

我怎麼能每上面記錄之後發生Col1Col2分組選擇記錄,其中EventType = 3Col1Col2特定羣組中。

例如用下面的數據

Col1, Col2, EventType, DateTime 
A  B  1  2012-1-1 
A  B  3  2011-1-1 
A  B  1  2010-1-1 
C  D  1  2012-1-1 
C  D  2  2011-1-1 
C  D  2  2010-1-1 
C  D  3  2009-1-1 
C  D  2  2008-1-1 
C  D  3  2007-1-1 
C  D  1  2006-1-1 
C  D  2  2005-1-1 

我想選擇

Col1, Col2, EventType, DateTime 
A  B  1  2012-1-1 

C  D  1  2012-1-1 
C  D  2  2011-1-1 
C  D  2  2010-1-1 
+0

您的事件發生1,2總是evvent後3 ....這種情況下,不是在你塞納里奧來 EF 3 2012-1-1 EF 1 2011-1-1 – 2013-05-03 07:25:01

回答

3

您可以通過使用max函數子查詢:

SELECT Col1, Col2, EventType, DateTime 
FROM theTable A 
WHERE DateTime > 

(SELECT MAX(DateTime) 
FROM theTable SUB 
WHERE EventType = 3 
AND SUB.COL1 = A.COL1 
AND SUB.COL2 = A.COL2) 
0
select Col1, Col2, EventType, DateTime 
From yourtable A, 
(select Col1, Col2 from yourtable group by Col1, Col2) B 
where A.EventType<3 and A.Col1 =B.Col1 And A.Col2=B.Col2 
0

要獲得期望的結果

 Select Col1, Col2, EventType, DateTime from table where EventType<3 
0

試試這個,

Select a.* FROm yourtable A JOIN 

(SELECT * FROM yourTable WHERE EventType=3) b 
ON A.Col1=B.Col1 
AND A.Col2 = B.Col2 
WHERE A.dateTime>B.DateTime 
1

它可以解決這個使用ROW_NUMBER()

  1. 分區的行成(Col1, Col2)組和排名列按升序各組DateTime

    Col1 Col2 EventType DateTime EventRank 
    ---- ---- --------- -------- --------- 
    A  B  1   2012-1-1 3 
    A  B  3   2011-1-1 2 
    A  B  1   2010-1-1 1 
    C  D  1   2012-1-1 8 
    C  D  2   2011-1-1 7 
    C  D  2   2010-1-1 6 
    C  D  3   2009-1-1 5 
    C  D  2   2008-1-1 4 
    C  D  3   2007-1-1 3 
    C  D  1   2006-1-1 2 
    C  D  2   2005-1-1 1 
    
  2. 另外,通過(Col1, Col2, EventType)劃分的行和在降序順序的DateTime排名。

    Col1 Col2 EventType DateTime EventRank EventSubRank 
    ---- ---- --------- -------- --------- ------------ 
    A  B  1   2012-1-1 3   1 
    A  B  3   2011-1-1 2   1 
    A  B  1   2010-1-1 1   2 
    C  D  1   2012-1-1 8   1 
    C  D  2   2011-1-1 7   1 
    C  D  2   2010-1-1 6   2 
    C  D  3   2009-1-1 5   1 
    C  D  2   2008-1-1 4   3 
    C  D  3   2007-1-1 3   2 
    C  D  1   2006-1-1 2   2 
    C  D  2   2005-1-1 1   4 
    
  3. 選擇子集,其中EventType = 3 AND EventSubRank = 1

    Col1 Col2 EventType DateTime EventRank EventSubRank 
    ---- ---- --------- -------- --------- ------------ 
    A  B  3   2011-1-1 2   1 
    C  D  3   2009-1-1 5   1 
    
  4. 通過接合回經排序行組和選擇其EventRank值比所述子集中的相應的一些較大的後者的行使用它作爲一個過濾器。

這裏有一個完整的查詢:

WITH ranked AS (
    SELECT 
    *, 
    EventRank = ROW_NUMBER() OVER (PARTITION BY Col1, Col2   ORDER BY DateTime ASC), 
    EventSubRank = ROW_NUMBER() OVER (PARTITION BY Col1, Col2, EventType ORDER BY DateTime DESC) 
    FROM atable 
), 
filtered AS (
    SELECT * 
    FROM ranked 
    WHERE EventType = 3 
    AND EventSubRank = 1 
) 
SELECT 
    r.Col1, 
    r.Col2, 
    r.EventType, 
    r.DateTime 
FROM ranked 
INNER JOIN filtered f 
    ON r.Col1 = f.Col1 
    AND r.col2 = f.Col2 
    AND r.EventRank > f.EventRank 
;