sql - 在 SQL 中使用复杂的构造列作为 GROUP BY 子句的一部分时如何遵循 DRY

标签 sql dry

我经常必须使用相当复杂的构造列来编写查询,我将根据该列进行聚合。例如:

SELECT  
EXTRACT(week FROM to_timestamp("Date Created"/1000)) AS week
...

我知道你不能在 GROUP BY 子句中使用别名(这个 Why doesn't Oracle SQL allow us to use column aliases in GROUP BY clauses? 问题从逻辑上解释了原因),但是除了重新进行列计算之外,我还能做些什么,还是我坚持这个:

SELECT COUNT(*), EXTRACT(week FROM to_timestamp("Date Created"/1000)) AS week
FROM mytable
GROUP BY EXTRACT(week FROM to_timestamp("Date Created"/1000))

最佳答案

我经常通过使用子查询来打破复杂性。

select count(*), week
from
(
    SELECT EXTRACT(week FROM to_timestamp("Date Created"/1000)) AS week
    FROM mytable
) sel
GROUP BY week

到目前为止,分而治之的方法已经取得了很好的效果。

更新

解决此问题的替代方案:

  1. 计算列(如 @gbn 在他的回答中所述)。

    • 优点:
      • 您可以声明一个在大多数查询中经常使用的列
      • 某些 RDBM 允许您在计算列上创建索引(对于性能非常重要)
    • 缺点:
      • 并非所有 RDBM 都提供计算列
      • 您最终可能会声明一个用于一个非常具体的查询(系统中有数千个查询)的列。有一天,这个查询将会发生变化,并且该列将只是坐在那里......
  2. CTE

关于sql - 在 SQL 中使用复杂的构造列作为 GROUP BY 子句的一部分时如何遵循 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262905/

相关文章:

sql - 将表中的多行合并为 1 个结果集行

sql - openerp : using the value of a variable in where clause

sql - PostgreSQL 上的计数估计

sql查询减去两个表值并将它们保存在第一个表中?

msbuild - 如何避免MSBuild中的重复?

JavaScript DRY 对象构造函数

javascript - 在客户端 Javascript 中调用 Django `reverse`

php - 将 CSV 导入 Mysql 期间的 NULL 字段

reference - 在 rust 中保持干燥

java - 这里如何同时遵守 "composition over inheritance"和DRY原则呢?