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

如何获取单个表中每组键值的最大行数?

  •  1
  • scottm  · 技术社区  · 15 年前

    我有一个mssql 2000表,它有很多重复的条目。每行都有一个有效的变更数据列。我想通过获取每个键值的最大值(effectiveChange)的行来获取最新的行。

    这是一些示例数据:

    NPANXX TZONE EFFCHANGE RATE
    555555 1     01/01/09   1
    555555 1     05/01/09   6
    214555 2     01/01/09   1
    214555 2     05/01/09   3
    657555 3     05/01/09   1
    657555 1     01/01/09   1
    

    我想到了这个:

    SELECT DISTINCT
      NPANXX,
      TZONE,
      RATE
    FROM AreaCodes
    INNER JOIN (SELECT DISTINCT NPANXX, EFFCHANGE FROM AREACODES) b
      ON b.NPANXX = AreaCodes.NPANXX
    GROUP BY 
      NPANXX, 
      TZONE, 
      RATE 
    HAVING AreadCodes.EFFCHANGE = max(b.EFFCHANGE)
    

    我的问题是,这个查询是否会为每个键(npanxx)提供max effchange行,还是只为整个表提供max(effchange)行?

    1 回复  |  直到 15 年前
        1
  •  3
  •   SQLMenace    15 年前

    一种方法是,既然您在2005年及以后使用的是2000,那么您也可以使用行号()。

    SELECT t1.* 
    from AreaCodes t1
    INNER JOIN (SELECT NPANXX, max(EFFCHANGE) as MaxDate FROM AREACODES
    group by NPANXX) t2 
      ON t1.NPANXX = t2.NPANXX
    and t1.EFFCHANGE = t2.MaxDate
    

    这是完整的代码,包括DML和DDL

    create table AreaCodes(NPANXX int,TZONE int,EFFCHANGE datetime,RATE int)
    
    insert AreaCodes values(555555,1,'20090101',1)
    insert AreaCodes values(555555,1,'20090501',6)
    insert AreaCodes values(214555,2,'20090101',1)
    insert AreaCodes values(214555,2,'20090501',3)
    insert AreaCodes values(657555,3,'20090501',1)
    insert AreaCodes values(657555,1,'20090101',1)
    
    
    SELECT t1.* 
    from AreaCodes t1
    INNER JOIN (SELECT NPANXX, max(EFFCHANGE) as MaxDate FROM AREACODES
    group by NPANXX) t2 
      ON t1.NPANXX = t2.NPANXX
    and t1.EFFCHANGE = t2.MaxDate
    
    
    
    output
    657555  3   2009-05-01 00:00:00.000 1
    555555  1   2009-05-01 00:00:00.000 6
    214555  2   2009-05-01 00:00:00.000 3