group-by无法保留副本

3z6pesqy  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(236)

我正在桌面上使用mysql 8.0ce和mysql server 5.0。当我使用group by时,结果无法保留重复记录,这是我需要的参考。我该怎么处理?
例如,我在表调度程序中有几个日期:

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

我不知道该怎么做。

aor9mmx1

aor9mmx11#

按定义按字段分组可删除重复项。
例如,查询

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 |
+------------+----------+

如果要保留重复的日期,但仍然要找出哪些日期出现了多次,则需要使用子查询。
如果您有mysql 8+,它允许CTE,您的查询将如下所示:

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 ,不会出现多次的记录。

m0rkklqb

m0rkklqb2#

实际上您使用了以下查询:

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

此查询表示需要在表调度程序中显示计数大于1的所有sdate,并且在表数据中,所有三个日期都有重复的条目。
如果要在查询结果中保留重复项,请使用以下查询:

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

希望能消除你的疑虑!

相关问题