表[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 |
答案 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列值的最新日期。)