Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL查询与共享逻辑相结合_Sql_Postgresql - Fatal编程技术网

将SQL查询与共享逻辑相结合

将SQL查询与共享逻辑相结合,sql,postgresql,Sql,Postgresql,我目前正在复制一个相当大的SQL聚合查询,这样我就可以运行它一次,返回整个数据集的指标,然后再次对每天的指标进行分组 下面是计算总体指标的查询的简化示例 SELECT sum(sentiment) FILTER (WHERE user = :user) AS total_sentiment, avg(sentiment) FILTER (WHERE user = :user) AS average_sentiment, count(messages) FILTER (WHERE se

我目前正在复制一个相当大的SQL聚合查询,这样我就可以运行它一次,返回整个数据集的指标,然后再次对每天的指标进行分组

下面是计算总体指标的查询的简化示例

SELECT
  sum(sentiment) FILTER (WHERE user = :user) AS total_sentiment,
  avg(sentiment) FILTER (WHERE user = :user) AS average_sentiment,
  count(messages) FILTER (WHERE sender = :user) AS total_messages
FROM
  "Messages"
WHERE
  date >= :start AND date < :end;
选择
总和(情绪)过滤器(其中用户=:用户)作为总情绪,
平均(情绪)过滤器(其中user=:user)作为平均情绪,
将(邮件)筛选器(其中发件人=:用户)计数为邮件总数
从…起
“消息”
哪里
日期>=:开始和日期<:结束;
这是一个计算相同指标的方法,但每天一次

SELECT
  date_trunc('day', date) AS date,
  sum(sentiment) FILTER (WHERE user = :user) AS total_sentiment,
  avg(sentiment) FILTER (WHERE user = :user) AS average_sentiment,
  count(messages) FILTER (WHERE sender = :user) AS total_messages
FROM
  "Messages"
WHERE
  date >= :start AND date < :end;
GROUP BY 1
ORDER BY 1
选择
日期(“日”,日期)作为日期,
总和(情绪)过滤器(其中用户=:用户)作为总情绪,
平均(情绪)过滤器(其中user=:user)作为平均情绪,
将(邮件)筛选器(其中发件人=:用户)计数为邮件总数
从…起
“消息”
哪里
日期>=:开始和日期<:结束;
按1分组
按1订购
有没有一种方法可以在不复制大部分逻辑的情况下组合这两个查询

以编程方式构建查询字符串是一种选择,但我绝对不想走这条路

如果查询真的像上面的例子一样简单,那么复制它们就不是什么问题了,但是它们处理更复杂的连接,而统计函数保持它们的同步已经很棘手了


理想情况下,输出将是一个表,其第一行包含总体指标,其余行将是每日计算。

最简单的方法是使用分组集。:

SELECT date_trunc('day', date) AS date,
       sum(sentiment) FILTER (WHERE user = :user) AS total_sentiment,
       avg(sentiment) FILTER (WHERE user = :user) AS average_sentiment,
       count(messages) FILTER (WHERE sender = :user) AS total_messages
FROM "Messages"
WHERE date >= :start AND date < :end
GROUP BY GROUPING SETS ( (), (date) );
选择日期(“日”,日期)作为日期,
总和(情绪)过滤器(其中用户=:用户)作为总情绪,
平均(情绪)过滤器(其中user=:user)作为平均情绪,
将(邮件)筛选器(其中发件人=:用户)计数为邮件总数
来自“消息”
其中日期>=:开始和日期<:结束
分组集合((),(日期));

您可以使用窗口功能:

SELECT DISTINCT
  date_trunc('day', date) AS date,
  sum(sentiment) FILTER (WHERE user = :user) OVER() AS total_sentiment,
  avg(sentiment) FILTER (WHERE user = :user) OVER() AS average_sentiment,
  count(messages) FILTER (WHERE sender = :user) OVER() AS total_messages,
  sum(sentiment) FILTER (WHERE user = :user) OVER(PARTITION BY date_trunc('day', date)) 
     AS total_sentiment_per_day,
  ...
FROM "Messages"
WHERE  date >= :start AND date < :end;
ORDER BY 1
选择DISTINCT
日期(“日”,日期)作为日期,
sum(情绪)过滤器(其中user=:user)OVER()作为总情绪,
平均(情绪)过滤器(其中user=:user)OVER()作为平均情绪,
将()上的(邮件)筛选器(其中发件人=:用户)计数为总邮件数,
总和(情绪)过滤器(其中用户=:用户)超过(按日期划分('day',date))
作为每天的总情绪,
...
来自“消息”
其中日期>=:开始和日期<:结束;
按1订购