Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
alexander.se Member Откуда: Сообщений: 4 |
Здравствуйте, есть таблица с такой структурой:
нужно выбрать данные по послед |
||||||||||||
19 июл 19, 13:17 [21930190] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
И что у вас не получается? |
19 июл 19, 13:20 [21930197] Ответить | Цитировать Сообщить модератору |
alexander.se Member Откуда: Сообщений: 4 |
Гавриленко Сергей Алексеевич, Не дописал тему, enter'ом отступы далал и она почему-то опубликовалась( CreditID GraphicID PayDate --------------------------------------- 1------------1-----------2019-01-01 1------------1-----------2019-02-01 1------------2-----------2019-01-02 1------------2-----------2019-02-02 Нужно нужно выбрать последние даты выплат(PayDate) по последнему графику(GraphicID) для каждого CreditID Написал такой запрос, но такой запрос выбирает последнюю дату по каждому GraphicID а не по последнему SELECT DISTINCT CreditID, MAX(PayDate), GraphicID FROM Credits.Graphics GROUP BY CreditID, GraphicID HAVING GraphicID = MAX(GraphicID) ORDER BY CreditID ASC |
19 июл 19, 13:46 [21930225] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20974 |
|
||
19 июл 19, 14:05 [21930248] Ответить | Цитировать Сообщить модератору |
alexander.se Member Откуда: Сообщений: 4 |
Akina, Грубо говоря по максимальному GraphicID. В "таблице" которую я привел там как бы два графика, 1 и 2 |
19 июл 19, 14:37 [21930281] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20974 |
Что-то типаWITH cte AS ( SELECT CreditID, GraphicID, PayDate, RANK() OVER (PARTITION BY CreditID ORDER BY GraphicID DESC) r1, RANK() OVER (PARTITION BY CreditID, GraphicID ORDER BY PayDate DESC) r2 ) SELECT CreditID, GraphicID, PayDate FROM cte WHERE r1=1 AND r2=1 ? |
19 июл 19, 14:49 [21930295] Ответить | Цитировать Сообщить модератору |
alexander.se Member Откуда: Сообщений: 4 |
Кажись да, а можете подробнее объяснить как это "RANK() OVER (PARTITION BY CreditID ORDER BY GraphicID DESC) r1" работает? |
||
19 июл 19, 15:02 [21930316] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20974 |
Берётся группа записей с совпадающим CreditID. Сортируется по убыванию GraphicID. После чего данному выражению присваивается значение минимального порядкового номера той записи в группе, которое имеет то же GraphicID, что и текущая запись. Применительно к показанным данным - группа одна (CreditID=1), и сортировка/нумерация в ней будет такой:
Записи внутри подгруппы могут располагаться произвольным образом (1 и 2 могут поменяться местами, равно как и 3 и 4), на результат это не влияет. |
||||||||||||||||||||||||||||
19 июл 19, 15:20 [21930350] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Вот тут приведён пример применения всех ранжирующих функций, по моему, это очень наглядно и понятно: https://docs.microsoft.com/ru-ru/sql/t-sql/functions/ranking-functions-transact-sql А тут конкретно про RANK: https://docs.microsoft.com/ru-ru/sql/t-sql/functions/rank-transact-sql |
||
19 июл 19, 16:00 [21930425] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |