根据当前日期查询日期最近的项目

时间:2019-06-03 14:37:11

标签: sql sql-server tsql

我正在尝试根据当前日期获得商品编号和价格的最接近日期。该查询给我输出,但不是我想要的方式。

同一商品的价格不同,并且没有过滤。

这是我的查询:

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 个答案:

答案 0 :(得分:3)

您可以尝试使用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

答案 1 :(得分:3)

您可以按 DATEDIFF 的绝对值排序吗?

ORDER BY ABS(DATEDIFF(day, REQUIRED_DATE, GETDATE()))

答案 2 :(得分:0)

这似乎是问题的迭代

我不确定您要施加什么约束

  1. 最大日期
  2. 最近的日期(但不是将来的日期)
  3. 最近的日期(过去或现在)

这是一个示例表,如果要在 2019/6/3 进行查询,我们想要哪一行:

| 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 in SQL Fiddle

进一步阅读