答案 0 :(得分:3)
试试这个:
Select tb1.* from Table1 as tb1
inner join (
Select city, Max(ref_id) as 'ref_id' from Table1 group by city
) as tb2
on tb1.city = tb2.city and tb1.ref_id = tb2.ref_id
答案 1 :(得分:2)
测试数据:
DECLARE @t_temp TABLE (ID smallint,
name varchar(10),
city varchar(10),
ref_id smallint);
INSERT INTO @t_temp
VALUES
(1, 'xyz', 'a', 101),
(2, 'pqr', 'a', 102),
(3, 'ijk', 'a', 103),
(4, 'abc', 'b', 104),
(5, 'ahg', 'c', 10);
实际查询:
SELECT ID
, name
, city
, ref_id
FROM (SELECT *
, ROW_NUMBER() OVER (PARTITION BY city ORDER BY ref_id DESC) Ranking
FROM @t_temp) base
WHERE Ranking = 1;
结果:
ID name city ref_id
------ ---------- ---------- ------
3 ijk a 103
4 abc b 104
5 ahg c 10
基本上,我正在做的是为按city
分组并按ref_id
排序的所有记录分配'排名',然后仅保留“头号”记录。这是Rahul提出的替代方案,也是您问题的有效解决方案。两者之间的唯一区别是,在Rahul的示例中,如果多个记录存在相同的city
和ref_id
(考虑到它是最高的记录),他将返回多个记录,其中上述解决方案将仅返回一条记录。要达到与Rahul相同的行为,您可以将ROW_NUMBER()
更改为RANK()
或DENSE_RANK()
。
答案 2 :(得分:-1)
您可以简单地选择最大的ref_id(在您想要返回的其他列中),然后按城市分组。
所以当只有一个城市时,A'这一行将被退回 当有两个城市时,B' B'然后将返回具有最大ref_id的行。
这意味着每个城市都会获得一行,这将始终是最高的ref_id。
SELECT name, city, Max(ref_id)
From Table
Group By city