2015-08-13 65 views
1

我需要一個查詢來選擇表中的行,以便從給定的列中搜索來自其他兩列的每個唯一對的最大值。考慮這個非常簡單的示例表格:SQLite SQL查詢 - 3級/嵌套在同一個表上?

a b c d 
1 1 0 1 
1 1 2 2 
1 2 1 1 
1 2 3 2 
2 1 7 5 
2 1 6 4 

唯一對由列a和b形成。我們在d列中尋找最大值。結果返回相應的列a,b和c。因此,對於上面的樣本數據,返回的結果應該是這樣的:

a b c 
1 1 2 
1 2 3 
2 1 7 

我已經嘗試嵌套查詢,聯接和我還沒有達到我的目標。我還進行了Google搜索,尋找討論並諮詢了幾本數據庫書籍,但無濟於事。我看到很多涉及多個表的嵌套查詢的示例,但沒有涉及同一個表的嵌套查詢。

看來問題需要三遍(嵌套): 1)獲得一組唯一一個& b對 2)該組中的每一行的行求d的最大值:返回一組的,b和d行 3)對於每個三元組的a,b和d值,查詢返回a,b和c列。

非常感謝幫助。

+0

create table T(a int,b int,c int,d int); (1,1,0,1),(1,1,2,2),(1,2,1,1), (1,2,3,2),(2,1 ,7,5),(2,1,6,4); –

回答

3

讓你錯了,對不起。 您可以使用GROUP BY作爲2列來查找最大值,然後加入原始表。 在你的榜樣,這個查詢做的工作:

SELECT t2.a,t2.b,t2.c 
FROM (SELECT a, b, max(d) as max_d 
FROM TABLE_NAME 
GROUP BY a,b) t1 
inner join TABLE_NAME t2 on(t1.a=t2.a AND t1.b=t2.b AND t1.max_d=t2.d) 
+0

它不是最大值(d)之後的OP。他想找到列c的值,其中d對於 – cha

+0

這個更好的最大值。我正在刪除我的答案,因爲您在末尾提出了相同的答案 – cha

1

另一種選擇是在select事業使用子查詢,一個額外的好處是,它會工作,即使有重複a, b, d組合

select 
    a, 
    b, 
    (
     select c 
     from T t2 
     where t1.a = t2.a and t1.b = t2.b 
     order by t2.d desc 
     limit 1 
    ) c 

from T t1 
group by a, b; 
1

在SQLite的3.7.11或更高版本,可以從簡單的列值SELECT既不是分組也不彙總,輸出將來自該MAX/MIN相匹配的同一行:

SELECT a, b, c, MAX(d) 
FROM MyTable 
GROUP BY a, b 

注意:如果您省略了MAX(d),這不起作用。

+0

謝謝!由於我只想要列a,b和c,所以如果嵌套在另一個選擇中,則此方法有效。 [code] Select a,b,c from(SELECT a,b,c,MAX(d) FROM T GROUP BY a,b)[/ code] –

+0

* '會得到優化;你*必須*有一個實際使用的MAX()。 –

+0

嗯,它適用於我的測試案例。 –