4

最新のレコードを取得して、NULL一致しないものを見つけようとしています。問題は、サブクエリが複数の結果を返すことです。

データセット

| | ID | DD | SIG_ID | DCRP |
--------------------------------------------
| | 1 | 2010-06-01 | 1 | エキスパート |
| | 2 | 2010-09-01 | 1 | エキスパート |
| | 3 | 2010-12-01 | 1 | エキスパート |
| | 4 | 2010-12-01 | 1 | エキスパート II |
| | 5 | 2011-03-01 | 1 | エキスパート II |
| | 6 | 2011-06-01 | 1 | (ヌル) |
| | 7 | 2010-06-01 | 2 | シニア |
| | 8 | 2010-09-01 | 2 | シニア |
| | 9 | 2010-09-01 | 2 | シニア |
| | 10 | 2010-12-01 | 2 | シニアⅡ |
| | 11 | 2011-03-01 | 2 | (ヌル) |
| | 12 | 2011-03-01 | 2 | シニア |
| | 13 | 2010-06-01 | 3 | (ヌル) |
| | 14 | 2010-09-01 | 3 | (ヌル) |
| | 15 | 2010-12-01 | 3 | (ヌル) |

クエリ

SELECT a.sig_id, a.id, 
  CASE
    WHEN b.dcrp IS NULL
      THEN
        (SELECT dcrp
         FROM tbl
         WHERE sig_id = a.sig_id
           AND id < a.id
           AND dcrp IS NOT NULL)
      ELSE b.dcrp
  END AS dcrp
FROM
  (SELECT sig_id, MAX(id) id
  FROM tbl
  GROUP BY sig_id) a
LEFT JOIN
  (SELECT id, dcrp
   FROM tbl
   WHERE dcrp IS NOT NULL) b ON b.id = a.id

望ましい結果

dcrpそれぞれの最新のものを取得しsig_idます。

| | ID | DD | SIG_ID | DCRP |
--------------------------------------------
| | 5 | 2011-03-01 | 1 | エキスパート II |
| | 12 | 2011-03-01 | 2 | シニア |
| | 15 | 2010-12-01 | 3 | (ヌル) |

SQL フィドル

4

3 に答える 3

10

以下を使用できます。

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY SIG_ID 
                                ORDER BY CASE WHEN DCRP IS NOT NULL THEN 0 ELSE 1 END,
                                DD DESC) RN
    FROM tbl
)
SELECT *
FROM CTE 
WHERE RN = 1

そしてフィドル

于 2013-03-05T16:32:03.317 に答える
2
;with si as (
  select distinct sig_id from tbl
)

select * 
from si
cross apply (select top 1 * from tbl where si.sig_id=tbl.sig_id order by case when dcrp is null then 1 else 0 end asc,dd desc) sii

およびフィドラーを使用: http://sqlfiddle.com/#!3/8e267/2/0

于 2013-03-05T16:37:14.460 に答える
-2

サブクエリが複数の行を返すため、SQLFiddle のクエリが失敗します。
追加TOP 1すると修正されます。よろしければご確認ください。

THEN
        (SELECT TOP 1 dcrp
         FROM tbl
         WHERE sig_id = a.sig_id
           AND id < a.id
           AND dcrp IS NOT NULL)
于 2013-03-05T16:31:00.400 に答える