Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать данные по последней дате  [new]
alexander.se
Member

Откуда:
Сообщений: 4
Здравствуйте,
есть таблица с такой структурой:

CreditID GraphicID PayDate





нужно выбрать данные по послед
19 июл 19, 13:17    [21930190]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
И что у вас не получается?
19 июл 19, 13:20    [21930197]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
alexander.se
по последнему графику(GraphicID)
Что такое "последний график" В Вашем понимании? график, минимальная дата которого максимальна?
19 июл 19, 14:05    [21930248]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
alexander.se
Member

Откуда:
Сообщений: 4
Akina,

Грубо говоря по максимальному GraphicID. В "таблице" которую я привел там как бы два графика, 1 и 2
19 июл 19, 14:37    [21930281]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
Что-то типа
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]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
alexander.se
Member

Откуда:
Сообщений: 4
Akina
Что-то типа
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

?


Кажись да, а можете подробнее объяснить как это "RANK() OVER (PARTITION BY CreditID ORDER BY GraphicID DESC) r1" работает?
19 июл 19, 15:02    [21930316]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
alexander.se
как это "RANK() OVER (PARTITION BY CreditID ORDER BY GraphicID DESC) r1" работает?

Берётся группа записей с совпадающим CreditID. Сортируется по убыванию GraphicID. После чего данному выражению присваивается значение минимального порядкового номера той записи в группе, которое имеет то же GraphicID, что и текущая запись. Применительно к показанным данным - группа одна (CreditID=1), и сортировка/нумерация в ней будет такой:
CreditIDGraphicIDPayDateНомер записиМин.номер записи с тем же GraphicID aka RANK()
122019-01-0211
122019-02-0221
112019-01-0133
112019-02-0143

Записи внутри подгруппы могут располагаться произвольным образом (1 и 2 могут поменяться местами, равно как и 3 и 4), на результат это не влияет.
19 июл 19, 15:20    [21930350]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные по последней дате  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
alexander.se
Кажись да, а можете подробнее объяснить как это "RANK() OVER (PARTITION BY CreditID ORDER BY GraphicID DESC) r1" работает?
Неужели можно объяснить понятнее и быстрее, чем в хелпе?

Вот тут приведён пример применения всех ранжирующих функций, по моему, это очень наглядно и понятно: 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 Ответить