0

いくつかの条件に基づいて除外する必要があるデータを取得します。サンプルデータ:

Cust_ID Date    Result
1   2013-08-15  On hold
2   2013-08-16  NULL
3   2013-08-18  WIP
1   2013-08-20  Completed
3   2013-08-25  NULL
4   2013-08-28  NULL
4   2013-08-29  NULL

条件:

  1. 最新の日付に基づいて個別の Cust_ID を取得します (つまり、Max(Date))。
  2. Result が最新の Date に対して Null の場合、NULL 以外の他の Result を使用して最新のレコードを取得します。
  3. 同じ Cust_ID を持つすべてのレコードの結果が NULL の場合、日付に基づいて最新のものを選択します

目的の出力は次のようになります。

Cust_ID Date    Result
1   2013-08-20  Completed
2   2013-08-16  NULL    
3   2013-08-18  WIP
4   2013-08-29  NULL

お知らせ下さい。

4

2 に答える 2

0

CTEを使用すると簡単に実行できます.CTEは「必要ない」ことに注意してください(サブクエリを使用できます)が、何をしているのかが明確になると思います。

WITH NonNull AS
(
   SELECT CustID, MAX(Date) as Date
   FROM tablename
   GROUP BY CustID
   WHERE Result is not null
), Others AS
(
   SELECT CustID, MAX(Date) as Date
   FROM tablename
   GROUP BY CustID
   WHERE CustID NOT IN (SELECT CustID FROM NonNull)
), AlltogetherNow -- not really needed but clearer
(
   SELECT CustID, Date
   FROM NonNull
   UNION ALL
   SELECT CustID, Date
   FROM Others
)
SELECT A.CustID, A.Date, J.Results
FROM AlltogetherNow A
JOIN tablename J ON A.CustID = J.CustID AND A.Date = J.Date
于 2013-10-09T01:33:18.023 に答える
0

IS NULLまず、各行にインジケーターが必要です。

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

CREATE TABLE dbo.Results
    ([CustID] int, [Date] datetime, [Result] varchar(9))
GO

INSERT INTO dbo.Results
    ([CustID], [Date], [Result])
VALUES
    (1, '2013-08-15 00:00:00', 'On Hold'),
    (2, '2013-08-16 00:00:00', NULL),
    (3, '2013-08-18 00:00:00', 'WIP'),
    (1, '2013-08-20 00:00:00', 'Completed'),
    (3, '2013-08-25 00:00:00', NULL),
    (4, '2013-08-28 00:00:00', NULL),
    (4, '2013-08-29 00:00:00', NULL)
GO

クエリ 1 :

SELECT *,CASE WHEN Result IS NULL THEN 0 ELSE 1 END IsNotNull
  FROM dbo.Results

結果

| CUSTID |                          DATE |    RESULT | ISNOTNULL |
|--------|-------------------------------|-----------|-----------|
|      1 | August, 15 2013 00:00:00+0000 |   On Hold |         1 |
|      2 | August, 16 2013 00:00:00+0000 |    (null) |         0 |
|      3 | August, 18 2013 00:00:00+0000 |       WIP |         1 |
|      1 | August, 20 2013 00:00:00+0000 | Completed |         1 |
|      3 | August, 25 2013 00:00:00+0000 |    (null) |         0 |
|      4 | August, 28 2013 00:00:00+0000 |    (null) |         0 |
|      4 | August, 29 2013 00:00:00+0000 |    (null) |         0 |

次に、各顧客NULLの最初の行と最初の行を決定する必要があります。そのために関数をNOT NULL使用できます。また、行ROW_NUMBER()があるかどうかを顧客ごとに知る必要があります。NOT NULL

クエリ 2 :

SELECT *,
       ROW_NUMBER()OVER(PARTITION BY CustID,IsNotNull ORDER BY [Date] DESC) _rn,
       COUNT(Result)OVER(PARTITION BY CustID) NotNullCount
  FROM(
    SELECT *,CASE WHEN Result IS NULL THEN 0 ELSE 1 END IsNotNull
    FROM dbo.Results
  )X1

結果

| CUSTID |                          DATE |    RESULT | ISNOTNULL | _RN | NOTNULLCOUNT |
|--------|-------------------------------|-----------|-----------|-----|--------------|
|      1 | August, 20 2013 00:00:00+0000 | Completed |         1 |   1 |            2 |
|      1 | August, 15 2013 00:00:00+0000 |   On Hold |         1 |   2 |            2 |
|      2 | August, 16 2013 00:00:00+0000 |    (null) |         0 |   1 |            0 |
|      3 | August, 25 2013 00:00:00+0000 |    (null) |         0 |   1 |            1 |
|      3 | August, 18 2013 00:00:00+0000 |       WIP |         1 |   1 |            1 |
|      4 | August, 29 2013 00:00:00+0000 |    (null) |         0 |   1 |            0 |
|      4 | August, 28 2013 00:00:00+0000 |    (null) |         0 |   2 |            0 |

最後に、計算された行番号を使用して、行がある場合は最初の行を除外し、NOT NULL行がない場合は最初の行を除外することができます。NULLNOT NULL

クエリ 3 :

SELECT CustID,[Date],Result
FROM(
  SELECT *,
         ROW_NUMBER()OVER(PARTITION BY CustID,IsNotNull ORDER BY [Date] DESC) _rn,
         COUNT(Result)OVER(PARTITION BY CustID) NotNullCount
    FROM(
      SELECT *,CASE WHEN Result IS NULL THEN 0 ELSE 1 END IsNotNull
      FROM dbo.Results
    )X1
  )X2
 WHERE _rn = 1 AND SIGN(NotNullCount) = IsNotNull

結果

| CUSTID |                          DATE |    RESULT |
|--------|-------------------------------|-----------|
|      1 | August, 20 2013 00:00:00+0000 | Completed |
|      2 | August, 16 2013 00:00:00+0000 |    (null) |
|      3 | August, 18 2013 00:00:00+0000 |       WIP |
|      4 | August, 29 2013 00:00:00+0000 |    (null) |
于 2013-10-09T01:47:41.967 に答える