sql - 有没有更有效的方法来返回匹配最大值的记录?
问题描述
我有一张包含感兴趣领域的表格:
Order Shift DateTime
23605624 Red 43470.23958
23605624 Yellow 43469.73958
23605624 Green 43469.38542
23605917 Red 43471.26042
23605917 Green 43471.73958
23605953 Red 43470.23958
23605953 Yellow 43469.17083
我想要 [Order] 和 [Shift],其中 [DateTime] 是每个 [Order] 的最大值。所以上表将转换为:
Order Shift DateTime
23605624 Red 43470.23958
23605917 Green 43471.73958
23605953 Red 43470.23958
虽然我不需要 DateTime 字段。
我实际上已经实现了这一点,但是该方法感觉过于复杂(并且查询运行需要相当长的时间)我在 from 子句和其中一个连接中都有子查询。
感觉我应该能够在 where 子句中按照“value=max(value)”的行进行某种连接,但我似乎无法弄清楚,因为子查询已经有一个连接并且还包括一个case 语句,我似乎无法掌握语法。
这是我拥有的完整代码:
SELECT
max_datetime.[Order],
max_datetime.[Line],
max_datetime.[Quantity],
max_datetime.[UoM],
shifts.[Shift]
FROM (
SELECT
SCMPEH.PRONUM as [Order],
SCMPEH.LINNUM as [Line],
SUM(SCMPEH.PEHQTY) as [Quantity],
SCMPEH.PEHUNT as [UoM],
MAX(CASE
WHEN SCMPEH.PEHSTT < '05:45:00'
THEN SCMPEH.PEHDAT + SCMPEH.PEHSTT + 1
ELSE SCMPEH.PEHDAT + SCMPEH.PEHSTT
END) as [DateTime]
FROM
SCMPEH
INNER JOIN SCMLIN on
(SCMLIN.LINNUM = SCMPEH.LINNUM)
INNER JOIN SCMSHI on
(SCMSHI.SHINUM = SCMPEH.SHINUM)
WHERE (
SCMPEH.PEHDAT >= '1/1/2019'
) AND (
SCMLIN.LINEXP = 'Y'
)
GROUP BY
SCMPEH.LINNUM,
SCMPEH.PRONUM,
SCMPEH.PEHUNT
) as max_datetime
INNER JOIN (
SELECT
SCMPEH.PRONUM as [Order],
SCMSHI.SHIDES as [Shift],
CASE
WHEN SCMPEH.PEHSTT < '05:45:00'
THEN SCMPEH.PEHDAT + SCMPEH.PEHSTT + 1
ELSE SCMPEH.PEHDAT + SCMPEH.PEHSTT
END as [DateTime]
FROM
SCMPEH
INNER JOIN SCMSHI on
(SCMSHI.SHINUM = SCMPEH.SHINUM)
WHERE (
SCMPEH.PEHDAT >= '1/1/2019'
)
) as shifts on
(shifts.[Order] = max_datetime.[Order]) AND
(shifts.[DateTime] = max_datetime.[DateTime])
我最感兴趣的是 [Shift] 字段。
解决方案
一种选择是WITH TIES
与row_number()
例子
Select top 1 with ties *
From YourTable
Order By Row_Number() over (Partition By [Order] Order By DateTime desc)
退货
Order Shift DateTime
23605624 Red 43470.23958
23605917 Green 43471.73958
23605953 Red 43470.23958
完全披露:使用带有 row_number() 的子查询会提高性能
推荐阅读
- go - 从 Windows 交叉编译到其他操作系统
- arrays - mongodb,如何使用聚合在嵌套数组上投影或推送根字段?
- spring-boot - Springboot zuul2 集成
- javascript - Electron - 如何将 JSON 从主窗口传递到远程窗口?
- c# - 下载 aws s3 预签名 url,失败时重试
- vector - 我可以得到一个四元数的单轴吗?
- bash - 如果一个(或多个)值为零,则不打印重复项
- typescript - 如何将 URL 重定向到公共页面?
- javascript - Jsx 返回对象并导致无限循环
- python - 在带有输入和交互式图表的多页 Dash 应用程序中,我应该在哪里放置回调函数?