2017-06-12 60 views
0

比方說,我有這樣的如果在另一列中有重複項,請在一列中選擇行最短的行?

ID PNR  NAME 
1 35  Television 
2 35  Television, flat screen 
3 35  Television, CRT 
4 87  Hat 
5 99  Cup 
6 99  Cup, small  

我想選擇項目的每個單獨類型(電視,帽子,杯子)行的數據庫 - 但對於那些在PNR多個條目那些我只想選擇名稱最短的那個。所以結果集將是

ID PNR  NAME 
1 35  Television 
4 87  Hat 
5 99  Cup 

我將如何使用SQLite構造這樣的查詢?它甚至有可能,還是我需要在應用程序代碼中進行這種過濾?

回答

2

由於SQLite的3.7.11,你可以use MIN() or MAX() to select a row in a group

SELECT ID, 
     PNR, 
     Name, 
     min(length(Name)) 
FROM MyTable 
GROUP BY PNR; 
+0

是'選擇ID,PNR,名稱由....集團PNR'實際支持,或者換句話說:其中一組具有共同的行'PNR'會在結果中被選爲這個「PNR」的單行?如果ID = 1的行包含「Television,flat」,並且ID = 2的行包含「Television」,它也可以工作嗎? –

+0

@StephanLechner查看鏈接。 –

+0

這真的很方便。挑剔的一面是「如果兩個或兩個以上的輸入行具有相同的最小或最大值,仍然存在歧義」,但現在真的很挑剔:-) –

0

可以使用MIN(length(name)) -aggregate功能找出幾個名字的最小長度;稍微棘手的是獲得相應的IDNAME。下面的查詢應該工作:

select mt1.ID, mt1.PNR, mt1.Name 
from MyTable mt1 inner join (
    select pnr, min(length(Name)) as minlength 
    from MyTable group by pnr) mt2 
    on mt1.pnr = mt2.pnr and length(mt1.Name) = mt2.minlength 
相關問題