2013-05-03 68 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 
; 
相关问题