分组依据无法保留重复项

时间:2018-10-08 15:36:50

标签: mysql

我在桌面上使用MySQL 8.0CE和MySQL Server 5.0。 当我使用group by结果无法保留重复记录时,我需要参考。 我该如何处理?

例如,我在表Scheduler中有几个日期:

 sDate:
    10/1/2018
    10/1/2018
    10/2/2018
    10/2/2018
    10/3/2018
    10/3/2018

当我执行以下语句时:

SELECT S.sDate
FROM Scheduler S
GROUP BY S.sDate
HAVING COUNT(*)>1

我应该在表sDate中得到完全相同的结果。但是,我得到这个:

10/1/2018
10/2/2018
10/3/2018

消除重复的地方,我不知道该怎么办。

2 个答案:

答案 0 :(得分:0)

实际上您在下面的查询中使用了

select S.sDate from Scheduler S group by S.sDate having COUNT(*)>1

此查询表明您需要在表Scheduler中显示所有计数大于1的sDate,并且在表数据中所有三个日期都有重复的条目。

如果要在查询结果中保留重复项,请使用以下查询:

select S.sDate from Scheduler S group by S.sDate having COUNT(*)>= 1

希望它消除了您的疑问!

答案 1 :(得分:0)

按定义按字段分组会删除重复项。

例如查询

SELECT dt, COUNT(*) AS dt_count
FROM Scheduler
GROUP BY dt

返回以下结果:

+------------+----------+
|     dt     | dt_count |
+------------+----------+
| 2018-10-01 |        2 |
| 2018-10-02 |        2 |
| 2018-10-03 |        2 |
+------------+----------+

如果您的日期仅发生一次,则该日期仍会显示一次。例如,如果我们添加一行2018-10-04,我们将有以下内容:

+------------+----------+
|     dt     | dt_count |
+------------+----------+
| 2018-10-01 |        2 |
| 2018-10-02 |        2 |
| 2018-10-03 |        2 |
| 2018-10-04 |        1 |
+------------+----------+

如果您想保留重复项,但仍要找出哪些日期不止一次,则需要使用子查询。

如果您拥有允许CTE的MySQL 8+,则您的查询将如下所示:

WITH 
    Dupes(dt, dt_count) AS
    (
        SELECT dt, COUNT(*)
        FROM Scheduler
        GROUP BY dt
        HAVING COUNT(*) > 1
    )
SELECT 
    Scheduler.dt,
    Dupes.dt_count
FROM Scheduler
    INNER JOIN Dupes ON
        Dupes.dt = Scheduler.dt

使用不允许CTE的较早版本,您将无法插入Dupes查询:

SELECT 
    Scheduler.dt,
    Dupes.dt_count
FROM Scheduler
    INNER JOIN 
    (
        SELECT dt, COUNT(*) AS dt_count
        FROM Scheduler
        GROUP BY dt
        HAVING COUNT(*) > 1
    ) Dupes ON
        Dupes.dt = Scheduler.dt

因为我们使用的是INNER JOIN,所以不会出现不止一次的记录。