Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据每天的设备使用情况对id进行分段_Sql_Sql Server - Fatal编程技术网

Sql 如何根据每天的设备使用情况对id进行分段

Sql 如何根据每天的设备使用情况对id进行分段,sql,sql-server,Sql,Sql Server,目标:我想根据每天的设备类型使用情况对ID进行分类。如果Id仅使用pc,则为“pc”。如果只是移动的,那么“移动的”。如果至少有一台手机和一台电脑,则“两者” 样本数据: 这是我迄今为止尝试过的,但没有成功: 我的输出应该如下所示: CASE表达式每行最终显示一次,因此它的工作方式与您编写的方式不同。因此,您可以使用exists: 您需要按日期、id分组,并计算设备的不同值: 请参见这将帮助您或给您一个想法: ;WITH cte AS (SELECT DISTINCT dates, id

目标:我想根据每天的设备类型使用情况对ID进行分类。如果Id仅使用pc,则为“pc”。如果只是移动的,那么“移动的”。如果至少有一台手机和一台电脑,则“两者”

样本数据:

这是我迄今为止尝试过的,但没有成功:

我的输出应该如下所示:

CASE表达式每行最终显示一次,因此它的工作方式与您编写的方式不同。因此,您可以使用exists:

您需要按日期、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