我在桌面上使用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
消除重复的地方,我不知道该怎么办。
答案 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
,所以不会出现不止一次的记录。