2011-10-01 87 views
2

我有一個帶有column1和column2的表格(它們都包含TEXT)。我想:優化兩個COUNT/DISTINCT查詢

1)COLUMN1 @表,不區分大小寫

2)COLUMN1 @表和列2 @表,不區分大小寫的唯一行的計數獨特的行數

SELECT count(*) AS unique_row1 FROM (SELECT DISTINCT lower(column1) FROM table); 

SELECT count(*) AS unique_rows12 FROM (SELECT DISTINCT lower(column1),lower(column1) FROM table); 

有沒有更有效的方法來做到這一點?有一種方法可以在一個查詢中完成嗎?我使用SQLite3。

在此先感謝。

編輯(由於@ypercube's response): 歸類爲默認(區分大小寫的,至少我沒有做任何地方COLLATE NOCASE)。

而且我做了一個測試,並與COLLATE NOCASE這是相當快和數量都是相同的:

# time echo "SELECT count(DISTINCT lower(column1)), count(DISTINCT lower(column1 || column2)) FROM table;" | sqlite3 db.sqlite3 
1643|5997 
echo 0.00s user 0.00s system 25% cpu 0.003 total 
sqlite3 db.sqlite3 0.58s user 0.04s system 96% cpu 0.643 total 

# time echo "SELECT count(DISTINCT column1), count(DISTINCT column1 || column2) FROM table;" | sqlite3 db.sqlite3    
1658|6199 
echo 0.00s user 0.00s system 36% cpu 0.002 total 
sqlite3 db.sqlite3 0.42s user 0.04s system 95% cpu 0.483 total 

# time echo "SELECT count(DISTINCT column1 COLLATE NOCASE), count(DISTINCT (column1 || column2) COLLATE NOCASE) FROM table;" | sqlite3 db.sqlite3 
1643|5997 
echo 0.00s user 0.00s system 32% cpu 0.002 total 
sqlite3 db.sqlite3 0.43s user 0.04s system 98% cpu 0.481 total 

COUNT(DISTINCT column1, column2)顯示了一個錯誤,但:wrong number of arguments to function count(),但我希望我有你的想法。

+0

* row1 * and * row2 * are ** rows ** or ** columns **? – EmptyStack

+0

我很抱歉。當然,他們是專欄。編輯。 –

+0

我猜'COUNT(DISTINCT column1,column2)'不工作是SQLite的限制。 –

回答

3

你可以試試這個:

SELECT count(distinct lower(column1)) 
    FROM table 

而對於第二:

SELECT count(distinct lower(column1 || column2)) 
    FROM table 

注:在第二種情況下,你必須使用合併,如果你的列可以是空值。

+0

非常感謝,速度提高了4倍! –

+0

@IOXenus:如果你使用:'SELECT count(distinct column1)FROM table',你會得到不同的結果嗎? –

+0

@ypercube:是的,因爲該列具有相同的值,但具有不同的大小寫。 –

1

我認爲文本比較默認情況下不區分大小寫。這是否工作?

SELECT COUNT(DISTINCT column1) 
    , COUNT(DISTINCT column1, column2) 
FROM table 
+0

我編輯了更廣泛的回覆的帖子,但總之 - 不,它沒有工作(默認排序);有時我也需要混合使用它,所以設置COLLATE NOCASE也不會做這件事。雖然謝謝! –

+0

我很抱歉,這是我的錯,我不熟悉'SELECT' /'COLLATE'語法。非常感謝! –