Sqlite
選擇具有最小值的所有行
在 Sqlite 3 中,我試圖弄清楚如何根據最小值選擇行。我認為我對相關術語的了解不足,無法有效地搜尋Google。
該表如下所示:
num text num2 ---------- ---------- ---------- 0 a 1 0 a 2 1 a 3 1 b 4
我想獲取 和的
num2
行。我想根據文本列的每個唯一值的 num 的最小值進行選擇。1, 2``4
所以,對於
text = 'a'
,最小值num
是0
,所以我想要第 1 行和第 2 行。對於text = 'b'
,最小值num
是1
,所以我想要行4
。使用 group by 的各種組合,我可以得到 rows
1
和2
or rows1
and4
。我覺得我缺少一個可以做我想做的事情的 SQL 組件,但我無法弄清楚它可能是什麼。進行此類查詢的正確方法是什麼?
可能的解決方案
我找到了一種方法來做到這一點。我沒有足夠的聲譽來回答我自己的問題,所以我在這裡進行更新。我不確定它是否總是正確或效率如何。歡迎任何意見。
我使用了一個複合選擇語句,其中一個查詢為文本的每個唯一值找到 num 的最小值:
sqlite> select num, text from t group by text having num = min( num ); num text ---------- ---------- 0 a 1 b
然後我將它與完整表連接起來,以獲取與這兩列匹配的所有行。
sqlite> with u as ( select num, text from t group by text having num = min( num ) ) select t.* from t join u on t.num = u.num and t.text = u.text; num text num2 ---------- ---------- ---------- 0 a 1 0 a 2 1 b 4
如您所見,簡單的 GROUP BY 將不起作用,因為它只會返回每個組的一條記錄。
您的加入工作正常。
num
對於大表,只有在連接列 (和text
)上有索引時才會有效。或者,您可以使用相關子查詢:
SELECT * FROM t WHERE num = (SELECT MIN(num) FROM t AS t2 WHERE t2.text = t.text);
[SQLFiddle](http://www.sqlfiddle.com/#!5/bda38/4)
執行時,此查詢不需要臨時表(您的查詢是針對 的結果
u
),但會為 中的每條記錄執行子查詢t
,因此text
應該建立索引。(或者在兩者上都使用索引text
並num
獲得覆蓋索引。)