【问题标题】:How do I incorporate a timestamp column into a query that already uses and aggregate function?如何将时间戳列合并到已经使用和聚合函数的查询中?
【发布时间】:2021-11-12 09:36:21
【问题描述】:

我有一个名为 textbankvendor.messages_export 的 sql 数据库,其中包含从从事文字营销活动的组织发送的所有消息。

我正在使用的这个数据库中的相关列如下:

activity_title (varchar):单个消息所属的文本库的名称

message_segments(整数):一条消息中的段数(一个段是160个字符的分组)

activity_published_at(时间戳):文本库的发布日期

因此,数据库中的几行示例如下:

activity_title message_segments activity published at
March Outreach Textbank 3 2021-03-18 20:32:00.045294
April Outreach Texbank 4 2021-04-22 18:27:00.045294
March Outreach Textbank 3 2021-03-18 20:32:00.045294
April Outreach Textbank 4 2021-04-22 18:27:00.045294

我的目标是输出数据库中所有唯一的文本库以及为该文本库中的所有消息发送的总消息段以及该文本库的发布日期。使用上面的例子,目标是这样的:

activity_title cumulative_message_segments activity published at
March Outreach Textbank 6 2021-03-18 20:32:00.045294
April Outreach Texbank 8 2021-04-22 18:27:00.045294

我能够成功使用以下查询来获取活动标题和消息段数:

SELECT 
activity_title
, SUM (message_segments) AS "cumulative_message_segments"
FROM textbankvendor.messages_export
GROUP BY 1
ORDER BY 1

但是,当尝试将 activity_published_at 作为变量时,我遇到了错误消息。以下查询给出(以及试错的几种变体/调整)给出错误消息:

SELECT 
activity_title
, SUM (message_segments) AS "cumulative_message_segments"
, activity_published_at
FROM textbankvendor.messages_export
GROUP BY 1
ORDER BY 1

状态:失败

SQL 中的错误:列“messages_export.activity_published_at”必须出现在 GROUP BY 子句中或用于聚合函数中

有没有办法成功查询到这个预期的结果?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql timestamp aggregate


【解决方案1】:

如果您希望每个活动标题有一行,我建议:

SELECT activity_title,
       SUM(message_segments) AS cumulative_message_segments,
       MIN(activity_published_at) as activity_published_at
FROM textbankvendor.messages_export
GROUP BY 1
ORDER BY 1;

您查询的问题是SELECT 列与GROUP BY 列不一致。

【讨论】:

    【解决方案2】:

    必须以某种方式聚合未出现在 GROUPBY 列表中的所有列。上表有两种选择:

    1. 按函数保留相同的组,并为时间戳取任意值(前提是它们在每个活动标题中是唯一的)
    SELECT 
    activity_title
    , SUM (message_segments) AS "cumulative_message_segments"
    , ANY_VALUE(activity_published_at) as activity_published_at
    FROM textbankvendor.messages_export
    GROUP BY 1
    ORDER BY 1
    
    1. 直接将时间戳放入按列分组
    SELECT 
    activity_title
    , activity_published_at
    , SUM (message_segments) AS "cumulative_message_segments"
    FROM textbankvendor.messages_export
    GROUP BY 1, 2
    ORDER BY 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2011-06-15
      • 2011-02-19
      相关资源
      最近更新 更多