Sql 如何根据案例分组
我有一个脚本,它可以整理两个日期之间的登录日志,并将它们分类为三个时间段之一。我需要它将它们组合在一起,统计在这些时间段内登录到系统的唯一用户的数量。例如: SQL: 选择 案例 在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,2018年第二学期:2018年7月23日至2018年12月9日 然后是“2018年第二学期” 当在castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-10 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-02-03 23:59:59'作为varchar之间创建lsl.time时,2018-19:10/12/2018至03/02/2019 然后是“圣诞假期,2018-19” 在castdatediffsecond、'01-01-1970 00:00:00'、'2019-02-04 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建lsl.TIME时,2019年第1学期:2019年2月4日至2019年6月23日 然后是“2019年第一学期” else'圣诞假期,2018-19' 以“登录日期”结束, countdistinct lsl.userid为“唯一登录名”, lsl.行动 来自前缀\u日志存储\u标准\u日志lsl 其中lsl.action='loggedin'和 lsl.time在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建 按lsl.timecreated、lsl.action分组 按lsl.timecreated asc订购 这将按预期列出各行上的数据:Sql 如何根据案例分组,sql,sql-server,Sql,Sql Server,我有一个脚本,它可以整理两个日期之间的登录日志,并将它们分类为三个时间段之一。我需要它将它们组合在一起,统计在这些时间段内登录到系统的唯一用户的数量。例如: SQL: 选择 案例 在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,20
------------------------------------------------------------
| Login Date | # of Unique Logins | action |
------------------------------------------------------------
| Semester 2, 2018 | 1 | loggedin |
| Semester 2, 2018 | 1 | loggedin |
| Semester 2, 2018 | 1 | loggedin |
| Semester 2, 2018 | 1 | loggedin |
| Christmas Break, 2018-19 | 1 | loggedin |
| Christmas Break, 2018-19 | 1 | loggedin |
| Christmas Break, 2018-19 | 1 | loggedin |
| Semester 1, 2019 | 1 | loggedin |
| Semester 1, 2019 | 1 | loggedin |
------------------------------------------------------------
我需要将登录日期分组如下。我该怎么做
------------------------------------------------------------
| Login Date | # of Unique Logins | action |
------------------------------------------------------------
| Semester 2, 2018 | 4 | loggedin |
| Christmas Break, 2018-19 | 3 | loggedin |
| Semester 1, 2019 | 2 | loggedin |
------------------------------------------------------------
我试图通过将相同的案例添加到组中,但它抛出了一个我不理解的错误:
...
分组
案例
在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,2018年第二学期:2018年7月23日至2018年12月9日
然后是“2018年第二学期”
当在castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-10 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-02-03 23:59:59'作为varchar之间创建lsl.time时,2018-19:10/12/2018至03/02/2019
然后是“圣诞假期,2018-19”
在castdatediffsecond、'01-01-1970 00:00:00'、'2019-02-04 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建lsl.TIME时,2019年第1学期:2019年2月4日至2019年6月23日
然后是“2019年第一学期”
终止
lsl.行动
按lsl.timecreated asc订购
错误:
SQLState:42000
错误代码:8120
列前缀_logstore_standard_log.timecreated在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中
您可以使用外部查询进行聚合
select "Login Date" , count("# of unique logins") , action
from (
select
case
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
then 'Semester 2, 2018'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
then 'Christmas Break, 2018-19'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
then 'Semester 1, 2019'
else 'Christmas Break, 2018-19'
end as 'Login Date',
count(distinct lsl.userid) as '# of unique logins',
lsl.action
from prefix_logstore_standard_log lsl
where lsl.action = 'loggedin' and
(lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
group by lsl.timecreated, lsl.action
order by lsl.timecreated asc
) as a
group by "Login Date" , action
使用CTE公共表表达式,它应该可以解决您的问题 不幸的是,我没有您的数据要测试,但是,以下内容应该可以工作:
with cte ([Login Date],[# of Unique Logins],[action])
as
(
select
case
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
then 'Semester 2, 2018'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
then 'Christmas Break, 2018-19'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
then 'Semester 1, 2019'
else 'Christmas Break, 2018-19'
end as 'Login Date',
count(distinct lsl.userid) as '# of unique logins',
lsl.action
from prefix_logstore_standard_log lsl
where lsl.action = 'loggedin' and
(lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
group by lsl.timecreated, lsl.action
order by lsl.timecreated asc
)
select
*
from cte
group by [Login Date],[# of Unique Logins],[action]
让我知道它是否有效。您是否意外回复了错误的帖子?我看不出这段代码有什么关系。您也没有对代码所做的事情提供任何解释。我只是给出了如何对用例进行分组的示例
with cte ([Login Date],[# of Unique Logins],[action])
as
(
select
case
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
then 'Semester 2, 2018'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
then 'Christmas Break, 2018-19'
when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
then 'Semester 1, 2019'
else 'Christmas Break, 2018-19'
end as 'Login Date',
count(distinct lsl.userid) as '# of unique logins',
lsl.action
from prefix_logstore_standard_log lsl
where lsl.action = 'loggedin' and
(lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
group by lsl.timecreated, lsl.action
order by lsl.timecreated asc
)
select
*
from cte
group by [Login Date],[# of Unique Logins],[action]