【问题标题】:Optimize two COUNT/DISTINCT queries优化两个 COUNT/DISTINCT 查询
【发布时间】:2011-10-01 09:30:02
【问题描述】:

我有一个包含 column1 和 column2 的表(它们都包含 TEXT)。我想得到:

1) column1@table 的唯一行数,不区分大小写

2) column1@table 和 column2@table 的唯一行数,不区分大小写

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(),但我希望我明白你的想法。

【问题讨论】:

  • row1row2rows 还是 columns
  • 非常抱歉。当然,它们是列。已编辑。
  • 我猜COUNT(DISTINCT column1, column2) 不工作是 SQLite 的限制。

标签: sql sqlite


【解决方案1】:

你可以试试这个:

SELECT count(distinct lower(column1))
  FROM table

第二个:

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

注意:在第二种情况下,如果您的列可以为空,则必须使用合并。

【讨论】:

  • 非常感谢,速度提高了 4 倍!
  • @IOXenus:如果你使用:SELECT count(distinct column1) FROM table,你会得到不同的结果吗?
  • @ypercube:是的,因为该列具有相同的值,但大小写不同。
  • 表格/列的排序规则是什么?
【解决方案2】:

我认为文本比较默认不区分大小写。这行得通吗?

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

【讨论】:

  • 我编辑了帖子以获得更广泛的回复,但简而言之 - 不,它不起作用(使用默认排序规则);有时我在混合情况下也需要它,所以设置COLLATE NOCASE 也不会这样做。不过谢谢!
  • 对不起,这是我的错,我不熟悉 SELECT / COLLATE 语法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多