Элемент запроса с ближайшей датой на основе текущей даты - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь получить ближайшую дату для номера товара и цену на основе текущей даты. Запрос дает мне вывод, но не так, как я хочу.

Существует другая цена для того же элемента, и она не фильтруется.

Вот мой запрос:

SELECT distinct [ITEM_NO]
     ,min(REQUIRED_DATE) as Date
     ,[PRICE]
  FROM [DATA_WAREHOUSE].[app].[OHCMS_HOPS_ORDERS]
  where (REQUIRED_DATE) >= GETDATE() and PRICE is not null
  group by ITEM_NO,PRICE
  order by ITEM_NO

Current vs Expected Output

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 03 июня 2019

Не могли бы вы заказать по абсолютному значению DATEDIFF ?

ORDER BY ABS(DATEDIFF(day, REQUIRED_DATE, GETDATE()))
3 голосов
/ 03 июня 2019

Вы можете попытаться использовать оконную функцию ROW_NUMBER, чтобы сделать это.

SELECT ITEM_NO,
       REQUIRED_DATE,
       PRICE
FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY ITEM_NO ORDER BY REQUIRED_DATE) rn
    FROM DATA_WAREHOUSE].[app].[OHCMS_HOPS_ORDERS]
    where REQUIRED_DATE >= GETDATE() and PRICE is not null
)t1
WHERE rn = 1
0 голосов
/ 03 июня 2019

Это похоже на итерацию задачи

Я не совсем уверен, какие ограничения вы хотите наложить

  1. Самая большая дата
  2. Самая последняя дата (но не в будущем)
  3. Ближайшая дата к сегодняшнему дню (прошлое или настоящее)

Вот пример таблицы и котораястрока, которую мы хотели бы получить, если запросить 6/3/2019 :

| Item | RequiredDate | Price |
|------|--------------|-------|
| A    | 2019-05-29   |    10 |
| A    | 2019-06-01   |    20 | <-- #2
| A    | 2019-06-04   |    30 | <-- #3
| A    | 2019-06-05   |    40 | <-- #1
| B    | 2019-06-01   |    80 |

Но я собираюсь догадаться, что вы ищете # 2

Мы можем определить нашу строку / наибольшую дату, сгруппировав по item и используя агрегированную операцию, такую ​​как MAX для каждой группы

SELECT o.Item, MAX(o.RequiredDate) AS MostRecentDt 
FROM Orders o
WHERE o.RequiredDate <= GETDATE()
GROUP BY o.Item

, которая возвращает это:

| Item | MostRecentDt |
|------|--------------|
| A    | 2019-05-29   |
| A    | 2019-06-01   |
| B    | 2019-06-01   |

Однако, как только мы сгруппируемся по этой записи, проблема заключается в том, чтобы вернуться к исходной таблице, чтобы получить полную строку / запись, чтобы выбрать любую другую информацию, не являющуюся частью исходного оператора GROUP BY

Используя ROW_NUMBER, мы можем сортировать элементы в наборе и указывать их порядок (самый высокий ... самый низкий)

SELECT *, ROW_NUMBER() OVER(PARTITION BY Item ORDER BY RequiredDate DESC) rn
FROM Orders o
WHERE o.RequiredDate <= GETDATE()
| Item | RequiredDate | Price | rn |
|------|--------------|-------|----|
| A    | 2019-05-29   |    10 | 1  |
| A    | 2019-06-01   |    20 | 2  |
| B    | 2019-06-01   |    80 | 1  |

Так как мы отсортировали DESC, теперь мы просто хотим запросить эту группу, чтобы получить самые последние значения для группы (rn=1)

WITH OrderedPastItems AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY Item ORDER BY RequiredDate DESC) rn
  FROM Orders o
  WHERE o.RequiredDate <= GETDATE()
)
SELECT * 
FROM OrderedPastItems
WHERE rn = 1

Вот MCVEв скрипте SQL

Дополнительная литература :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...