2017-01-27 6 views
1

Max(StartDate)でレコードのグループを選択する必要があり、同じStartDateを持つが複数のレコードがある場合EndDateが異なる場合NULL EndDateの値を超えるレコードを選択したい実際の日付です。日付値にヌル値を使用する

SELECT UPC, DocumentNumber, MAX(StartDate) AS 'StartDate' 
       FROM #tbDupRecs 
       --WHERE EndDate = CASE EndDate WHEN NULL THEN NULL ELSE EndDate END 
      GROUP BY UPC, DocumentNumber 
      Order By UPC, DocumentNumber, StartDate 

私は(上記のように)私が試したすべての日付を持つレコードをピックアップ... Selectステートメントやグループ化などでそれを持つことができないとして終了日のようなものを含めるしようとすると、エラーが発生します。 ...

答えて

1

私はこれがうまくいくはずだと思います...グループ化したレコードの各グループにRNを与え、トップのレコードを取得します。

with cte as(
SELECT 
    UPC, 
    DocumentNumber, 
    StartDate, 
    row_number over (partition by UPC, DocumentNumber order by case when StartDate is null then '12/31/2999' else StartDate end desc) as rn 
FROM #tbDupRecs) 

select * from cte where rn = 1 

OR

SELECT 
    UPC, 
    DocumentNumber, 
    StartDate 
FROM #tbDupRecs 
WHERE EXISTS (SELECT UPC, DocumentNumber, max(isnull(StartDate,'12/31/2999')) FROM #tbDupRecs group by UPC, DocumentNumber) 

OR

SELECT 
    r.UPC, 
    r.DocumentNumber, 
    r.StartDate 
FROM #tbDupRecs r 
INNER JOIN 
    (SELECT UPC, DocumentNumber, max(isnull(StartDate,'12/31/2999')) 
    FROM #tbDupRecs 
    group by UPC, DocumentNumber) r2 on r.UPC = r2.UPC and r.DocumentNumber = r2.DocumentNumber and isnull(r.StartDate,'12/31/2999') = isnull(r2.StartDate,'12/31/2999') 
+0

終了日がNullありがとうscsimonは、私はまだヌル値ではなく、'12/2999' 分の31のような何かを返すことがあります。 –

+0

@TiltingCodeこれらの3つのオプションはそれを行う必要があります – scsimon

+0

これらのソリューションを実行しました@TiltingCode – scsimon

関連する問題