как вывести из базы данных строки которые ближе всего к сегоднешей дате
Есть база данный со следующими записями
ID ITEM LOCATION DATE VALUE
16711663545 067771960 2002 01.01.2018 12.5000
1684043432 067771960 2002 30.11.2017 10.7000
1684039121 050374500 2002 01.02.2017 3.2500
1684039321 050374500 2002 02.05.2017 3.3300
1684039371 050374500 2002 07.07.2017 3.8900
1684043441 050374500 2002 03.01.2017 4.3400
1684043395 067771960 2006 01.01.2018 12.5000
11727914496 067771960 2006 30.11.2017 10.7000
1684013435 050374500 2006 01.02.2017 3.2500
1684014435 050374500 2006 02.05.2017 3.3300
1684054435 050374500 2006 07.07.2017 3.8900
1684014215 050374500 2006 03.01.2017 4.3400
как вывести строки с уникальными полями ITEM LOCATION где DATA самая ближайшая к сегодня
вывод должен быть следующий
ID ITEM LOCATION DATE VALUE
16711663545 067771960 2002 01.01.2018 12.5000
1684039371 050374500 2002 07.07.2017 3.8900
1684043395 067771960 2006 01.01.2018 12.5000
1684054435 050374500 2006 07.07.2017 3.8900
я пробовал
SELECT ID,ITEM, LOCATION, MAX(DATE) AS data,VALUE FROM TABLE GROUP BY ITEM,LOCATION;
но вывод не корректны
1684039371 050374500 2002 07.07.2017 3.8900
1684043432 067771960 2002 30.11.2017 10.7000
1684054435 050374500 2006 07.07.2017 3.8900
11727914496 067771960 2006 30.11.2017 10.7000
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
WITH cte AS
( SELECT *,
ROW_NUMBER() OVER (PARTITION BY item, location ORDER BY `date` DESC) rn
FROM test
)
SELECT id, item, location, `date`, `value`
FROM cte
WHERE rn = 1;
или
SELECT DISTINCT
FIRST_VALUE(id) OVER (PARTITION BY item, location ORDER BY `date` DESC) id,
item,
location,
MAX(`date`) OVER (PARTITION BY item, location) `date`,
FIRST_VALUE(`value`) OVER (PARTITION BY item, location ORDER BY `date` DESC) `value`
FROM test;
Если есть записи в будущем, добавить WHERE `date` <= CURRENT_DATE.
Если date хранится в строковом поле (что странно - хотя откуда такой формат?) - использовать явный CAST в тип DATE.