【问题标题】:How to find the maximum value of two interdependent columns如何找到两个相互依赖的列的最大值
【发布时间】:2021-08-23 07:59:39
【问题描述】:

我在 ERP 系统中有一个表,我正在尝试找到一些有效的方法来进行查询,以从相互依赖的两列中获取最大值。

例如:

order date time
487715 2021-06-08 13:35:52
487715 2021-06-12 08:59:28
487715 2021-06-12 10:06:13
572335 2021-08-06 10:23:15
572335 2021-06-01 06:42:40

我需要结果:

order  | date       | time
487715 | 2021-06-12 | 10:06:13
572335 | 2021-08-06 | 10:23:15

一种选择是选择日期的最大值并使用内连接重新附加表并找到最大时间值,但我不确定它的查询效率和速度如何。

select orderID,
       max(pickTime) pickTime,
       maxDate.pickDate
from (
        select orderID,
        max(pickDate) pickDate
        From TestDB.dbo.stockMovements
        group by orderID
    ) maxDate
    inner join TestDB.dbo.stockMovements movements on movements.orderID = maxDate.orderID and movements.pickDate = maxDate.pickDate
    group by maxDate.orderID, maxDate.pickDate

这不一定只是日期和时间,而只是数字。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • Microsoft SQL Server 2016
  • 这能回答你的问题吗? Get top 1 row of each group
  • 在这种情况下,您也可以简单地使用MAX(date + time),但它不太可能像其他答案那样高效

标签: sql sql-server tsql


【解决方案1】:

对每个订单的行进行排名,然后仅选择排名最高的行。

select * from
(
 select "order", "date", "time",
   row_number() over (partition by "order" order by "date" desc, "time" desc) r
 from TestDB.dbo.stockMovements
) t
where r = 1;

db<>fiddle

【讨论】:

    【解决方案2】:

    您可以使用row_number 为每一行分配优先级,然后选择具有最高优先级的行。

    with t as (
        select *, Row_Number() over (partition by [order] order by [date] desc, [time] desc) rn
        from Tablename
    )
    select [order], [date], [time]
    from t
    where rn=1;
    

    您的示例可能是人为的,但是如果这些是您的 实际 列名,您应该重新考虑并选择与保留关键字不同的更有意义的列名 - 这样做是有据可查的反-pattern 并强制使用不必要的大括号[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2021-09-19
      • 1970-01-01
      • 2020-02-13
      • 2010-11-11
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多