在多列上计算 DISTINCT

新手上路,请多包涵

有没有更好的方法来做这样的查询:

 SELECT COUNT(*)
FROM (SELECT DISTINCT DocumentId, DocumentSessionId
      FROM DocumentOutputItems) AS internalQuery

我需要计算此表中不同项目的数量,但不同的项目超过两列。

我的查询工作正常,但我想知道是否可以仅使用一个查询(不使用子查询)获得最终结果

原文由 Novitzky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

如果您正在尝试提高性能,您可以尝试在两列的哈希值或连接值上创建一个持久计算列。

一旦它被持久化,只要该列是确定性的并且您使用的是“健全”的数据库设置,就可以对其进行索引和/或在其上创建统计信息。

我相信计算列的不同计数将等同于您的查询。

原文由 Jason Horner 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用的是固定长度的数据类型,则可以转换为 binary 以非常轻松快速地完成此操作。假设 DocumentIdDocumentSessionId 都是 int s,因此是 4 个字节长…

 SELECT COUNT(DISTINCT CAST(DocumentId as binary(4)) + CAST(DocumentSessionId as binary(4)))
FROM DocumentOutputItems

我的具体问题要求我将 SUM 除以 COUNT 各种外键和日期字段的不同组合,按另一个外键分组,偶尔按某些值或键过滤.表很大,使用子查询大大增加了查询时间。而且由于复杂性,统计数据根本不是一个可行的选择。 CHECKSUM 解决方案的转换速度也太慢了,特别是由于各种数据类型,我不能冒险它的不可靠性。

但是,使用上述解决方案几乎没有增加查询时间(与简单地使用 SUM ),并且应该是完全可靠的!它应该能够帮助处于类似情况的其他人,所以我将其发布在这里。

原文由 IphStich 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进