按Month of TimeStamp分组

时间:2014-04-16 16:00:49

标签: sql timestamp teradata group-by

我尝试按两次分组,一次按个别级别字段,然后按时间戳字段的月份分组。

对SQL不熟悉,但这是我在阅读另一篇SO帖子后想出来的:SQL query to group by month part of timestamp

SELECT
        VwNIMUserDim.USER_EMAIL_ADDRESS,
         VwNIMEventFct.NIM_USER_ID, 
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 880 THEN 1 ELSE 0 END) AS APP_OPEN,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 881 THEN 1 ELSE 0 END) AS AUTODL_SETTINGS_SAVE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 882 THEN 1 ELSE 0 END) AS AUTO_QUERY_CONFIRM,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 883 THEN 1 ELSE 0 END) AS ISSUE_CLOSE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 884 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 885 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD_COMPLETE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 886 THEN 1 ELSE 0 END) AS PICKER_SEND_PICKS
 FROM RDMAVWSANDBOX.VwNIMEventFct
 GROUP BY NIM_USER_ID, MONTH('EVENT_GMT_TIMESTAMP')

我的SQL客户端Teradata返回的错误消息说: “SELECT FAILED Error 3706语法错误预期在','和MONTH关键字之间。

这是我第一次做两件事:分组两次并使用月份功能。

我在这里做错了什么?如何在每个月通过电子邮件地址用户进行分组?

3 个答案:

答案 0 :(得分:4)

Teradata /标准SQL中没有MONTH功能,它的提取(年/月/日/小时/分钟/秒):

EXTRACT(MONTH FROM EVENT_GMT_TIMESTAMP)

答案 1 :(得分:1)

您编写的查询将导致VwNIMUserDIm和VwNIMEventFct表(视图)之间的PRODUCT(笛卡尔)JOIN。我已经冒昧地根据您对先前响应的评论来修改SQL:

SELECT
        User_.USER_EMAIL_ADDRESS,
         Event_.NIM_USER_ID, 
         Event_.EVENT_GMT_TIMESTAMP(FORMAT 'yyyy-mm')(char(7)) AS EVENT_MONTH, 
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 880 THEN 1 ELSE 0 END) AS APP_OPEN,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 881 THEN 1 ELSE 0 END) AS AUTODL_SETTINGS_SAVE,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 882 THEN 1 ELSE 0 END) AS AUTO_QUERY_CONFIRM,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 883 THEN 1 ELSE 0 END) AS ISSUE_CLOSE,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 884 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 885 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD_COMPLETE,
         SUM(CASE WHEN Event_.NIM_EVENT_TYPE_ID = 886 THEN 1 ELSE 0 END) AS PICKER_SEND_PICKS
 FROM RDMAVWSANDBOX.VwNIMEventFct Event_
 JOIN RDMAVWSANDBOX.VwNIMUserDim User_
   ON Event_.NIM_USER_ID = User_.NIM_USER_ID
 GROUP BY 1,2;

答案 2 :(得分:0)

可能取决于数据库来源(MSSQL,mySQL,Oracle,DB2等)

SELECT
        VwNIMUserDim.USER_EMAIL_ADDRESS,
         VwNIMEventFct.NIM_USER_ID, 
         MONTH(EVENT_GMT_TIMESTAMP),
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 880 THEN 1 ELSE 0 END) AS APP_OPEN,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 881 THEN 1 ELSE 0 END) AS AUTODL_SETTINGS_SAVE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 882 THEN 1 ELSE 0 END) AS AUTO_QUERY_CONFIRM,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 883 THEN 1 ELSE 0 END) AS ISSUE_CLOSE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 884 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 885 THEN 1 ELSE 0 END) AS ISSUE_DOWNLOAD_COMPLETE,
         SUM(CASE WHEN NIM_EVENT_TYPE_ID = 886 THEN 1 ELSE 0 END) AS PICKER_SEND_PICKS
 FROM RDMAVWSANDBOX.VwNIMEventFct
 GROUP BY NIM_USER_ID, MONTH(EVENT_GMT_TIMESTAMP)