根据具有重复数据的列抓取最近的行?

时间:2009-09-17 18:51:00

标签: sql tsql

表[myRecords]

     A     |     B     |     C     |     D     |     E     |     F     |
------------------------------------------------------------------------
     1     |     10    |  1/1/09   |    abc    |    aaa    |    111    |
     2     |     10    |  1/2/09   |    def    |    bbb    |    222    |
     3     |     10    |  1/3/09   |    ghi    |    ccc    |    333    |
     4     |     12    |  1/4/09   |    jkl    |    ddd    |    444    |
     5     |     12    |  1/5/09   |    mno    |    eee    |    555    |
     6     |     13    |  1/6/09   |    pqr    |    fff    |    666    |
     7     |     13    |  1/7/09   |    stu    |    ggg    |    777    |
     8     |     14    |  1/8/09   |    vwx    |    hhh    |    888    |
     9     |     14    |  1/9/09   |    yza    |    iii    |    999    |
     10    |     15    |  1/10/09  |    bcd    |    jjj    |    101    |

结果应该是(抓取最近的(c)每个不同的(b)。

     A     |     B     |     C     |     D     |     E     |     F     |
------------------------------------------------------------------------
     3     |     10    |  1/3/09   |    ghi    |    ccc    |    333    |
     5     |     12    |  1/5/09   |    mno    |    eee    |    555    |
     7     |     13    |  1/7/09   |    stu    |    ggg    |    777    |
     9     |     14    |  1/9/09   |    yza    |    iii    |    999    |
     10    |     15    |  1/10/09  |    bcd    |    jjj    |    101    |

4 个答案:

答案 0 :(得分:3)

SELECT * FROM myRecords t1
 WHERE c = (SELECT max(c) FROM myRecords t2 WHERE t2.B = t1.B)

答案 1 :(得分:2)

select t.*
from (
    select b, max(c) as maxc
    from table1
    group by b
) tm
inner join table1 t on tm.b = t.b and tm.maxc = t.c

答案 2 :(得分:0)

select t.* from table t join
(select b, max(c) as maxc from table group by b) as t2 on t.b=t2.b and t.c=t2.maxc
order by t.b

答案 3 :(得分:0)

假设日期列永远不是NULL,如果您至少在SQL Server 2005中,我建议使用RANK()。如果您进行更改,则更容易管理,因为您不必更改子查询中的内容在主查询中。

对于SQL Server 2005及更高版本:

WITH myRecordsRanked(A,B,C,D,E,F,rk) AS (
  SELECT A,B,C,D,E,F,
    RANK() OVER (
      PARTITION BY B
      ORDER BY C DESC
    )
  FROM myRecords
)
  SELECT A,B,C,D,E,F
  FROM myRecordsRanked
  WHERE rk = 1;

选择rk = 1值会给你带来联系。如果您需要特定的一个绑定行,请使用tiebreaking ORDER BY列;如果您不需要在关系中进行一致的选择,请使用ROW_NUMBER,并发现值得避免额外排序。

对于SQL Server 2000:

SELECT A,B,C,D,E,F
FROM myRecords
WHERE NOT EXISTS (
  SELECT * FROM myRecords as R2
  WHERE R2.B = myRecords.B
  AND R2.C > myRecords.C
)

(这也将为您提供B列值的最新日期。)