2017-04-25 56 views
-2

我有表如下:具有鮮明地方條件

enter image description here

我想執行的城市不同,但如果城市是複製然後返回將具有最大REF_ID行。結果應包含所有列。

+1

顯示我們預期的結果,從這個樣本數據和是否使用的是'RDBMS'標記您的數據庫還 –

+1

? – Wanderer

+0

「結果應該包含所有列」,如果城市有多個同樣更高的'ref_id',那麼你想要哪一行? –

回答

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提出的替代方案,也是解決您的問題的有效方法。兩者之間唯一的區別是,在拉胡爾的例子中,如果多個記錄存在相同的cityref_id(考慮它是最高的),他將返回多個記錄,其中上述解決方案將僅返回單個記錄。要達到與Rahul相同的行爲,您可以將ROW_NUMBER()更改爲RANK()DENSE_RANK()

-1

你可以簡單地選擇最大REF_ID(您想拿回等欄目中),然後按城市。

因此,當只有一個城市的「A」此行會得到恢復。
如果有兩個城市'B',則返回最大ref_id的行。

這意味着你會得到每個城市一排,這將永遠是最高可能REF_ID。

SELECT name, city, Max(ref_id) 
From Table 
Group By city 
+2

GROUP BY無效。 – jarlh

+0

了'select'子句中所有列出的列必須出現在'組by'子句中,例如這是缺乏**姓名**列 – jean

+0

@jean對我來說完美的作品的失敗,我沒有得到任何錯誤或者是這樣的 – Hannes

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