如何在不删除重复值的情况下对数据集进行分组

Posted

技术标签:

【中文标题】如何在不删除重复值的情况下对数据集进行分组【英文标题】:How to group the data set without removing the duplication value 【发布时间】:2019-08-09 05:14:01 【问题描述】:

attendence sql file in here我想对数据集进行分组而不删除重复值。

我尝试关注查询。我只能与一天相关一次。

    SELECT 
        EnrolledID,
        Date,
        CASE WHEN Time > '1899-12-30 03:00:00' && Time <= '1899-12-30 12:15:00' THEN Time 
        END AS time_in ,
        CASE WHEN Time > '1899-12-30 12:15:00' && Time <= '1899-12-30 23:59:59' THEN Time 
        END AS time_out
    from attendance
        GROUP BY EnrolledID ;

上述查询的输出

EnrolledID      Date                time_in                 time_out    
23          2019-08-01 00:00:00     1899-12-30 07:54:40     NULL    
23          2019-08-01 00:00:00     NULL                    1899-12-30 16:01:40 
23          2019-08-02 00:00:00     1899-12-30 07:42:35      NULL   
23          2019-08-02 00:00:00    NULL                     1899-12-30 16:02:53 
23          2019-08-03 00:00:00     1899-12-30 07:37:41      NULL

预期输出。

EnrolledID      Date                time_in                 time_out    
    23          2019-08-01 00:00:00     1899-12-30 07:54:40     1899-12-30 16:01:40 
    23          2019-08-01 00:00:00     1899-12-30 07:42:35                 1899-12-30 16:01:40 
    23          2019-08-02 00:00:00     1899-12-30 07:42:35     1899-12-31 16:15:33 
    23          2019-08-02 00:00:00     1899-12-30 07:11:51                     1899-12-30 16:02:53 
    23          2019-08-03 00:00:00     1899-12-30 07:37:41      1899-12-31 16:15:00

【问题讨论】:

所以这是您的预期输出,或者您从上述查询中获得的输出。 非预期输出。链接图像显示原始数据集。我想根据我的数据集替换 NULL 值位置 有两次出现一个日期和empno。但是在组过程中,一条记录丢失了。如何避免重复删除器 你使用的是哪个版本的mysql @Nipun Sachinda 显示您的attendance 地图 【参考方案1】:

你可以试试这个。由于您的查询中已经有了time intime out,因此您可以使用union all 轻松获得所需的结果。

WITH CTE AS (
SELECT COUNT(Date) 
    EnrolledID,
    Date,
    CASE WHEN Time > '1899-12-30 03:00:00' && Time <= '1899-12-30 12:15:00' THEN Time 
    END AS time_in ,
    CASE WHEN Time > '1899-12-30 12:15:00' && Time <= '1899-12-30 23:59:59' THEN Time 
    END AS time_out
from attendance
    GROUP BY EnrolledID 
)
, CT AS (
    SELECT  EnrolledID, DATE, TIME_IN AS TIME FROM CTE WHERE TIME_IN IS NOT NULL 
    UNION ALL
    SELECT  EnrolledID, DATE, TIME_OUT FROM CTE WHERE TIME_OUT IS NOT NULL
)
SELECT EnrolledID, DATE , TIME FROM CTE ORDER BY DATE, TIME

如果他们在每个日期都有多条记录,而您只想要某些记录,那么您可以在 ct 部分下应用相同的过滤器以获得所需的输出。

虽然如果您共享您的表架构和示例输出,那么最好提供任何建议。

【讨论】:

***.com/questions/57404842/… 这是解决这个问题的一种方法。如何与 sql 文件共享? how can i share with sql file 是什么意思。 我添加了考勤表 sql 架构。 @NipunSachinda:正如预期的那样,这个问题有我们的答案。请为此案例发布新问题,因为它与最初提出的问题完全不同。您可以将其标记为已接受并为此提出新问题。

以上是关于如何在不删除重复值的情况下对数据集进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组

在不破坏顺序的情况下对列进行分组

如何在不使用 GROUP BY 子句的情况下对行进行分组

如何在不删除适配器的情况下更新数据集以反映数据源中添加的列?

Mysql:如何在不丢失组内个人行的情况下对组进行排序[关闭]

如何关闭多个数据集