2016-06-17 5 views
1

У меня есть таблица, которая имеет два поля, которые я хочу, чтобы принять решение о:T-SQL: Как выбрать строки на основе максимальной даты?

- DATE 
- DATE_LOADED 

Я хочу знать, если есть DATE (который может иметь множество связанных линий), скажем, «2016-06-15», который имеет две уникальные записи DATE_LOADED: '2016-06-16' и '2016-06-17', затем берут только строки MAX DATE_LOADED.

В реальном выражении в двух отчетах сообщалось о перекрывающихся данных за тот же день. Более поздний отчет - это исправление. Все столбцы могут обновляться, но DATE.

ASK:
Для каждого DATE (не только каждая отдельная линия), проверьте, если есть больше чем один DATE_LOADED, если есть то взять все строки, связанные с этой даты и где DATE_LOADED = MAX DATE_LOADED для этой конкретной даты.

+2

просьба предоставить образец данных и требуемый результат вывода, а также будет приветствоваться, если вы предоставите свои собственные попытки – Vasily

ответ

3

Это может быть сделано с помощью окна функции

select * 
from (
    select t.*, 
      row_number() over (partition by date order by date_loaded desc) as rn 
    from the_table t 
) x 
where rn = 1; 

Если есть несколько строк с той же максимальной датой, вышесказанное вернет только один из них.Если вы хотите, чтобы все, вы можете использовать что-то вроде этого:

select * 
from (
    select t.*, 
      max(date_loaded) over (partition by date) as max_date_loaded 
    from the_table t 
) x 
where date_loaded = max_date_loaded; 

Если вы хотите, чтобы отфильтровать фиников с помощью всего одного DATE_LOADED, вы можете улучшить запрос:

select * 
from (
    select t.*, 
      max(date_loaded) over (partition by date) as max_date_loaded, 
      count(*) over (partition by date) as cnt 
    from the_table t 
) x 
where date_loaded = max_date_loaded 
    and cnt > 1; 
+0

Это здорово, спасибо! Я взял второй пример, потому что есть несколько строк с одинаковой максимальной датой. Вот в чем вопрос. В вашем коде вам не хватает слов после «заказа» на 4-й строке, либо закажите его чем-то, либо удалите ключевое слово order, но оно не будет работать так, как оно есть. Благодаря! –

+0

@ ColinO'Brien: спасибо, исправлено. 'max()' вообще не нуждается в 'order by'. –

0

Я считаю, что вы после этого что-то вроде ниже

Select Date,MAX(DateLoaded) 
From TableName  
Group By Date 
3

Этот запрос будет получить вам список DATE, общее число различных DATE_LOADED значений для этой даты, и максимальное значение DATE_LOADED через эти записи.

SELECT DATE 
    , COUNT(DISTINCT DATE_LOADED) AS [Total Different DATE_LOADED Values] 
    , MAX(DATE_LOADED) AS [Max DATE_LOADED] 
FROM YOURTABLE 
GROUP BY DATE 
HAVING COUNT(DISTINCT DATE_LOADED) > 1 

Я видел это позже

затем взять все строки, связанные с этой датой и где DATE_LOADED = MAX DATE_LOADED для конкретной даты.

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

SELECT yt.* 
FROM YOURTABLE AS yt INNER JOIN 
    (SELECT DATE 
     , MAX(DATE_LOADED) AS [Max DATE_LOADED] 
    FROM YOURTABLE 
    GROUP BY DATE 
    HAVING COUNT(DISTINCT DATE_LOADED) > 1 
    ) AS subQry ON yt.DATE = subQry.DATE AND yt.DATE_LOADED = subQry.[Max DATE_LOADED] 
1

Для этой цели вы можете использовать КРОНШУЮ ПРИМЕНЯЮЩУЮ ИЛИ ВНУТРЕННУЮ СОЕДИНЕНИЕ. Ниже приведен пример использования CROSS APPLY.

SELECT t.[DATE], 
     t.DATE_LOADED  
FROM YourTable t 
CROSS APPLY (
    SELECT MAX(DATE_LOADED) as MAX_DATE_LOADED 
    FROM YourTable 
    WHERE [DATE] = t.[DATE]) as p 
WHERE t.DATE_LOADED = p.MAX_DATE_LOADED 

Например, если в таблице есть что-то вроде:

DATE  DATE_LOADED 
2016-06-15 2016-06-16 
2016-06-15 2016-06-17 
2016-06-15 2016-06-18 
2016-06-15 2016-06-18 

Выше запроса даст вам:

DATE  DATE_LOADED 
2016-06-15 2016-06-18 
2016-06-15 2016-06-18 
Смежные вопросы