选择日期Teradata SQL assistant时按月分组

选择日期Teradata SQL assistant时按月分组,sql,teradata,Sql,Teradata,我想知道2017年每个月的唯一用户总数。我试过: SELECT EVENT_DT - ((EVENT_DT -DATE'1900-01-07') MOD 7) AS dates, CLSFD_USER_ID AS user_id, COUNT(DISTINCT CLSFD_USER_ID) AS number_of_user_ids, COUNT(DISTINCT CLSFD_CAS_AD_ID) AS number_of_ads, SU

我想知道2017年每个月的唯一用户总数。我试过:

SELECT EVENT_DT - ((EVENT_DT -DATE'1900-01-07') MOD 7) AS dates,
       CLSFD_USER_ID AS user_id, 
       COUNT(DISTINCT CLSFD_USER_ID) AS number_of_user_ids,
       COUNT(DISTINCT CLSFD_CAS_AD_ID) AS number_of_ads,
       SUM(IMPRSN_CNT) AS number_of_impressions
FROM clsfd_access_views.CLSFD_CAS_AD_HST
WHERE CLSFD_SITE_ID = 3001
AND datum >= '2017-01-01'
GROUP BY 1,2

但这会返回一个错误。每月检索用户ID、广告和印象总数的最有效代码是什么

按用户进行聚合对我来说没有意义,因为你要计算的是用户。尝试仅按月份和年份分组:

GROUP BY EXTRACT(MONTH FROM datum), 2
选择
提取(从事件|DT开始的年份)||'-'||提取(从事件|DT开始的月份)作为月份,
计数(不同的CLSFD用户ID)作为用户ID的数量,
将(不同的CLSFD\u CAS\u AD\u ID)计数为广告的数量,
作为印数的总和(改进)
从clsfd\u访问\u视图。clsfd\u CAS\u AD\u HST
哪里
CLSFD_站点ID=3001和
基准>='2017-01-01'和基准<'2018-01-01'
分组
摘录(从事件开始的年份)| |'-'| |摘录(从事件开始的月份);

请注意,我更改了您对
数据的限制,以便也排除任何大于2017年的年份。

如果您希望此值包含在当前查询中,则应使用分析函数。例如,“每个月的唯一用户总数”类似于:

SELECT
    EXTRACT(YEAR FROM EVENT_DT) || '-' || EXTRACT(MONTH FROM EVENT_DT) AS month,
    COUNT(DISTINCT CLSFD_USER_ID) AS number_of_user_ids,
    COUNT(DISTINCT CLSFD_CAS_AD_ID) AS number_of_ads,
    SUM(IMPRSN_CNT) AS number_of_impressions
FROM clsfd_access_views.CLSFD_CAS_AD_HST
WHERE
    CLSFD_SITE_ID = 3001 AND
    datum >= '2017-01-01' AND datum < '2018-01-01'
GROUP BY
    EXTRACT(YEAR FROM EVENT_DT) || '-' || EXTRACT(MONTH FROM EVENT_DT);

请注意,这些值将对每个用户重复。

有一个小问题,即您不再有“数据”,因此无法在WHERE语句中引用该数据。但是我现在正在尝试你的建议,愚蠢的是我自己没有想到。@StephenTheunissen在
WHERE
子句中有
datum
不是问题,因为
WHERE
子句在发生
groupby
之前在整个表上求值。Teradata不允许在OLAP函数中使用
distinct
select count(distinct user_id) over(partition by EXTRACT(MONTH FROM datum))