2016-09-29 2 views
2

У меня есть tableA диапазонов дат:SQL Server найти самый последний диапазон дат

tranid item startdate  enddate 
--------------------------------------- 
1   A  1/1/2000  2/2/2005 
2   A  5/1/2000  2/2/2005 
3   B  7/8/2015  9/8/2015 
4   C  4/10/2007  7/20/2008 
5   C  4/10/2003  7/20/2005 

Как написать SQL запрос для выбрать только самые последние операции (Исх самые последние даты начала и окончания)?

Например, для A самый последний диапазон дат - от 5/1/2000 до 2/2/2005, а для C - самый последний диапазон дат C 4/10/2007 по 7/20/2008.

У меня полная потеря, чтобы написать это, потому что кажется легким, но нет.

select item, max(enddate), max(startdate) 
from tableA 
where max(enddate) 
group by item, enddate, startdate 

SQL Server вернул ошибку, связанную с 'having', на что-то в этом роде - проблема с агрегатами.

Грэкиас :)

+5

Что делать, если одна строка имеет максимальную дату начала, а другая имеет максимальную дату окончания? –

+0

Возможный дубликат [SQL Server: SELECT только строки с MAX (DATE)] (https://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) – Vadzim

ответ

2

У вас есть where max(enddate), который не имеет смысла, и вам не нужно включать STARTDATE/ENDDATE в вашей группе, всего пункта, так что попробуйте:

select item, max(enddate), max(startdate) 
from tableA 
group by item 
0

ROW_NUMBER Вам нужна оконная функция

:with cte as 
(
Select Row_Number() Over(Partition by item order by startdate desc) RN,* 
From yourtable 
) 
Select * 
From cte 
Where RN = 1 
0

Это классический аргумент-макс проблема: где вы хотите строки с самой последней датой начала.

Вам нужно разделить задачу на два этапа:

  1. вычислить самую позднюю дату начала для каждого элемента.
  2. Соедините максимальный результат с исходной таблицей, чтобы получить желаемые строки.

Решение:

SELECT b.tranid, b.item, a.maxstartdate, b.enddate 
FROM 
    (SELECT t.item, MAX(t.startdate) maxstartdate 
    FROM t 
    GROUP BY t.item) a 
JOIN t b 
ON a.maxstartdate = b.startdate AND a.item = b.item; 

Надеется, что это может помочь вам! :)

Смежные вопросы