我有一个包含感兴趣字段的表格:
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 子句和其中一个连接中都有子查询。
感觉我应该能够按照“value=max(value)”的方式在 where 子句中进行某种连接,但我似乎无法弄清楚,因为子查询已经有一个连接和还包括一个 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() 的子查询可以提高性能
关于sql - 有没有更有效的方法返回匹配最大值的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191381/