Sqlite

選擇具有最小值的所有行

  • April 11, 2018

在 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',最小值num0,所以我想要第 1 行和第 2 行。對於text = 'b',最小值num1,所以我想要行4

使用 group by 的各種組合,我可以得到 rows12or rows 1and 4。我覺得我缺少一個可以做我想做的事情的 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應該建立索引。(或者在兩者上都使用索引textnum獲得覆蓋索引。)

引用自:https://dba.stackexchange.com/questions/60350