代码之家  ›  专栏  ›  技术社区  ›  thomas

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

  •  2
  • thomas  · 技术社区  · 16 年前

    我知道我可以用CTE或其他方法来实现这一点,但我想知道这是否可以在一个select查询(无子选择)中实现。我想找到订单编号的最新crt,然后获取相关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
    
    5 回复  |  直到 6 年前
        1
  •  4
  •   Tomalak    16 年前
    SELECT
      MAX(id) id,
      po_nbr
    FROM
      temp
    GROUP BY
      po_nbr
    

    要获得关联的日期,您可以执行以下操作(注意,这意味着一个顺序id):

    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
    

    如果没有顺序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 波乌丁腈橡胶 帮助在最后一个查询中,最好创建一个组合索引。

        2
  •  2
  •   KM.    16 年前

    尝试:

    SELECT
        id,po_nbr --crt_ts --can show the date if you want
        FROM (SELECT 
                  id,po_nbr,crt_ts
                  ,ROW_NUMBER() OVER(partition BY po_nbr ORDER BY po_nbr,crt_ts DESC) AS RankValue
                  FROM temp
             ) dt
        WHERE RankValue=1
    
        3
  •  1
  •   Locksfree    16 年前
    SELECT 
      MAX(temp.id) AS id, det.po_nbr
    FROM
      temp
      INNER JOIN (SELECT po_nbr, MAX(crt_ts) AS maxcrt_ts FROM temp GROUP BY po_nbr) AS det ON temp.po_nbr = det.po_nbr AND temp.crt_ts = maxcrt_ts
    GROUP BY
      det.po_nbr
    
        4
  •  1
  •   D'Arcy Rittich    16 年前
    select t.id, tm.po_nbr
    from  temp t
    inner join (
        select po_nbr, max(crt_ts) as max_ts
        from temp 
        group by po_nbr
    ) tm on t.po_nbr = tm.po_nbr and t.crt_ts = max_ts
    
        5
  •  0
  •   Barry    16 年前

    选择最大值(id),采购编号 按po_nbr分组

    推荐文章