Оптимизация двух запросов COUNT / DISTINCT - PullRequest
2 голосов
/ 01 октября 2011

У меня есть таблица с column1 и column2 (оба они содержат TEXT).Я хочу получить:

1) количество уникальных строк column1 @ table, без учета регистра

2) количество уникальных строк column1 @ table и column2 @ table, case-нечувствительный

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 ): Сортировка была по умолчанию (чувствительна к регистру, впо крайней мере, я нигде не делал 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(), но я надеюсь, что вы поняли вашу идею.

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Вы можете попробовать это:

SELECT count(distinct lower(column1))
  FROM table

А для второго:

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

Примечание: во втором случае вы должны использовать coalesce, если ваши столбцы могут быть нулевыми.

1 голос
/ 23 января 2012

Я думаю, что сравнения текста по умолчанию не чувствительны к регистру.Это работает?

SELECT COUNT(DISTINCT column1)
     , COUNT(DISTINCT column1, column2)
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...