sql - 有没有更有效的方法返回匹配最大值的记录?

标签 sql sql-server

我有一个包含感兴趣字段的表格:

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 TIESrow_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/

相关文章:

sql - 如何通过SQL查询检查是否有JSON函数?

sql - 从一系列日期中获取所有前 5 个 id(数组)

sql-server - 在 SQL Server Management Studio 中,如何设置键盘快捷键以便 ctrl+w 关闭 XML 窗口?

sql - 动态 SQL - 从临时表中选取值

sql - 如何填补一系列数字之间的空白?

sql - 使用 Distinct 作为参数

sql - 将表创建从 MSSQL 转换为 PostgreSQL

sql-server - 更改本地时钟会影响远程 SQL Server 数据库功能

javascript - Client.query 未在 Node JS 中检索数据

java - Spring 隔离支持? MSQL 快照隔离