我正在尝试根据当前日期获得商品编号和价格的最接近日期。该查询给我输出,但不是我想要的方式。
同一商品的价格不同,并且没有过滤。
这是我的查询:
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
有什么想法吗?
答案 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)
这似乎是greatest-n-per-group问题的迭代
我不确定您要施加什么约束
这是一个示例表,如果要在 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
进一步阅读: