admin

SQL查询根据给定多条记录的不同最大值获取最大值

sql

我知道我可以使用CTE或其他方式执行此操作,但我想知道是否可以在一个选择查询中执行此操作(无子选择)。我想为po_nbr查找最新的crt_ts,然后获取关联的ID。


笔记:

id列不能保证是连续的,我为这个问题简化了它。


代码:

create table temp
(
    id int,
    po_nbr int,
    crt_ts datetime
)

insert into temp values (20, 100, '09/01/2009')
insert into temp values (3, 100, '09/03/2009')
insert into temp values (5, 100, '09/05/2009')
insert into temp values (6, 100, '09/07/2009')
insert into temp values (4, 200, '08/01/2009')
insert into temp values (29, 200, '08/03/2009')
insert into temp values (12, 200, '08/05/2009')
insert into temp values (18, 200, '08/07/2009')

所需结果:

id  po_nbr
---------
6   100
18  200

阅读 237

收藏
2021-06-07

共1个答案

admin

SELECT
  MAX(id) id,
  po_nbr
FROM
  temp
GROUP BY
  po_nbr

要获得关联的日期,您可以这样做(请注意,这意味着需要一个顺序编号):

SELECT
  temp.id,
  temp.po_nbr,
  temp.crt_ts
FROM
  temp
  INNER JOIN (
    SELECT MAX(id) id FROM temp GROUP BY po_nbr
  ) latest ON latest.id = temp.id

如果没有序列号,它将是:

SELECT
  MAX(temp.id) id,
  temp.po_nbr,
  temp.crt_ts
FROM
  temp INNER JOIN (
    SELECT   MAX(crt_ts) crt_ts, po_nbr 
    FROM     temp i
    GROUP BY po_nbr
  ) latest ON latest.crt_ts = temp.crt_ts AND latest.po_nbr = temp.po_nbr
GROUP BY
  temp.po_nbr,
  temp.crt_ts

GROUP BY如果可以保证每个po_nbr组没有两个相等的日期,则可以忽略。

在上一个查询中建立索引crt_ts并提供po_nbr帮助,最好创建一个组合索引。

2021-06-07