Sql 如何根据每天的设备使用情况对id进行分段
目标:我想根据每天的设备类型使用情况对ID进行分类。如果Id仅使用pc,则为“pc”。如果只是移动的,那么“移动的”。如果至少有一台手机和一台电脑,则“两者” 样本数据: 这是我迄今为止尝试过的,但没有成功: 我的输出应该如下所示: CASE表达式每行最终显示一次,因此它的工作方式与您编写的方式不同。因此,您可以使用exists: 您需要按日期、id分组,并计算设备的不同值:Sql 如何根据每天的设备使用情况对id进行分段,sql,sql-server,Sql,Sql Server,目标:我想根据每天的设备类型使用情况对ID进行分类。如果Id仅使用pc,则为“pc”。如果只是移动的,那么“移动的”。如果至少有一台手机和一台电脑,则“两者” 样本数据: 这是我迄今为止尝试过的,但没有成功: 我的输出应该如下所示: CASE表达式每行最终显示一次,因此它的工作方式与您编写的方式不同。因此,您可以使用exists: 您需要按日期、id分组,并计算设备的不同值: 请参见这将帮助您或给您一个想法: ;WITH cte AS (SELECT DISTINCT dates, id
请参见这将帮助您或给您一个想法:
;WITH cte AS (SELECT DISTINCT dates, id
, CASE device WHEN 'pc' THEN 1 WHEN 'mobile' THEN 2 END AS x
FROM #test1)
SELECT dates, id,
CASE SUM(x) WHEN 1 THEN 'pc' WHEN 2 THEN 'mobile' WHEN 3 THEN 'both' END
FROM cte GROUP BY dates, id
您可能会有更多的项目,只需将它们以2的幂编码为1、2、4、8、16等。非常有创意。当需要应用更多的条件时,这确实是非常有用的。这项工作也很有效,但我似乎无法理解。我不确定在查询数百万行时这是否会导致性能问题。
SELECT DISTINCT dates
, id
,CASE
WHEN device = 'pc' AND device = 'mobile' THEN 'Both'
WHEN device = 'pc' THEN 'pc'
ELSE 'mobile'
END AS x
FROM #test1
+------------+-----+--------+
| dates | id | x |
+------------+-----+--------+
| 2018-01-01 | 123 | both |
| 2018-01-01 | 800 | mobile |
| 2018-01-01 | 500 | pc |
| 2018-01-02 | 123 | mobile |
+------------+-----+--------+
select distinct t.dates, t.id,
(case when exists (select 1 from #test1 t1 where t1.dates = t.dates and t1.id = t.id and t1.device <> t.device)
then 'both'
else t.device
end) as x
from #test1 t;
SELECT dates
, id
,CASE COUNT(DISTINCT device)
WHEN 1 THEN MAX(device)
WHEN 2 THEN 'both'
END AS x
FROM #test1
GROUP BY dates, id
;WITH cte AS (SELECT DISTINCT dates, id
, CASE device WHEN 'pc' THEN 1 WHEN 'mobile' THEN 2 END AS x
FROM #test1)
SELECT dates, id,
CASE SUM(x) WHEN 1 THEN 'pc' WHEN 2 THEN 'mobile' WHEN 3 THEN 'both' END
FROM cte GROUP BY dates, id