与条件不同的地方不同

时间:2017-04-25 08:18:06

标签: sql

我的表格如下:

enter image description here

我想在城市上执行不同但如果城市重复则返回具有最大ref_id的行。结果应包含所有列。

3 个答案:

答案 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的示例中,如果多个记录存在相同的cityref_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