2017-01-27 4 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 

Я получаю ошибки при попытке включить что-то вроде EndDate как я не могу иметь его в заявлении Выберите или Group By, и т.д ... Все, что я пытался (как описано выше) выбирает запись с датой. ...

ответ

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 

ИЛИ

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

ИЛИ

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

Благодаря scsimon, где EndDate является Null я до сих пор возвращает нулевое значение, а не что-то вроде '12/31/2999' . –

+0

@TiltingCode эти три варианта должны делать это – scsimon

+0

Запустили ли вы какие-либо из этих решений @TiltingCode – scsimon