Макс (значение) столбцов на основе других столбцов - SQL - PullRequest
0 голосов
/ 05 сентября 2018

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

У меня много часовых прогнозных данных, и каждый час приходит новый прогноз, и все они прогнозируются с сегодняшнего дня и на пару дней вперед. Моя цель - создать запрос (для использования в виде), который дает мне прогнозные данные из последнего прогноза на каждый день (дата и час).

FDate = прогнозируемая дата

FHour = прогнозируемый час

RDate = Прогноз даты сделан

RHour = Часовой прогноз сделан

Мой стол:

 FDate       FHour   Value   RDate       RHour
 2018-09-02  10      99      2018-09-02  9
 2018-09-02  10      82      2018-09-02  8
 2018-09-02  10      86      2018-09-01  20

В этом примере я хочу только первую строку, потому что это самый новый прогноз.

Я пришел с запросом, который дает мне прогнозные данные за последнюю дату, когда был сделан прогноз, но не за последний час.

SELECT t.FDate, t.FHour, t.Value, t.RDate, t.RHour 
FROM MyTable t 
INNER JOIN (
SELECT FDate, MAX(RDate) As MaxDate
FROM Mytable 
GROUP BY FDate) tm t.FDate = tm.FDate AND t.RDate = tm.MaxDate 

Я пытался включить MAX (RHour) в запрос, но он дает мне только более ранние даты, чем сегодня, и самую последнюю дату в прогнозе, а не один раз между ними. Пример: вчера и ранее, а затем 2018-09-10, который является последним днем ​​в прогнозе, он не даст мне 2018-09-06 и так далее.

Результат моего запроса:

FDate       FHour   Value   RDate       RHour
2018-09-02  10      99      2018-09-02  9
2018-09-02  10      82      2018-09-02  8

Опять моя цель - вернуть только первую строку.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Получить последнюю запись по дате и часу, использовать ORDER BY в обоих столбцах и отсортировать оба по убыванию (DESC).

Получить только первый ряд, используйте TOP(1).

SELECT TOP(1) *
FROM MyTable
ORDER BY RDate DESC, RHour DESC
0 голосов
/ 05 сентября 2018

Способ сделать это с помощью функции row_number, потому что она позволит вам упорядочить все, что вам нужно.

Например, если вам нужна последняя строка для данной даты FDate, вы должны сделать что-то вроде:

;with t as (
    select *, row_number() over (partition by FDate, fHour 
                                 order by RDate desc, RHour desc) r
    from myTable
)
select * from t where r=1

Вы можете видеть, что это может быть приспособлено для разделения по вашему желанию (в этом примере я угадываю FDate и FHour) и упорядочение по вашему желанию. Все до вас.

...