2

次のテーブル構造が与えられた場合

Col1, Col2, EventType,  DateTime

のグループCol1ごとにレコードを選択Col2するにはどうすればよいですか?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
4

5 に答える 5

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)
于 2013-05-03T07:04:15.400 に答える
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
;
于 2013-05-03T07:33:19.083 に答える
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
于 2013-05-03T06:59:13.307 に答える
0

期待される結果を得るには

       Select   Col1, Col2, EventType, DateTime  from table where EventType<3
于 2013-05-03T07:00:21.560 に答える