Поскольку вы используете MySQL 5.7, который не поддерживает аналитические функции, вам нужно будет использовать переменные для хранения значений temp и name из предыдущей строки:
SELECT t.ID,
t.Name,
t.Temp
FROM ( SELECT t.*,
IF(@temp = t.temp AND @name = t.Name, 1, 0) AS IsDuplicate,
@temp:= t.temp,
@name:= t.Name
FROM YourTable AS t
CROSS JOIN (SELECT @temp := 0, @name := '') AS v
ORDER BY t.ID
) AS t
WHERE t.IsDuplicate = 0
ORDER BY ID;
Пример на БД <> Fiddle
Ключевые части (не в том порядке, в котором они появляются, а в том порядке, в котором логично думать об этом ).
(1) Инициализируйте переменные и упорядочите по идентификатору (или любым другим полям), чтобы гарантировать, что переменные назначены в правильном порядке
CROSS JOIN (SELECT @temp := 0, @name := '') AS v
ORDER BY t.ID
(2) Проверьте, соответствуют ли значения, хранящиеся в переменных, текущей строке, и отметьте 1 или 0
IIF(@temp = t.temp AND @name = t.Name, 1, 0) AS IsDuplicate
(3). Присвойте переменным значения temp и name в текущей строке, чтобы они можно проверить по следующей строке:
@temp:= t.temp,
@name:= t.Name
(4) Удалить дубликаты из окончательного набора данных:
WHERE t.IsDuplicate = 0;
Еще до go можно изменить IsDuplicate
пометьте как маркер группы и используйте GROUP BY
, чтобы вы могли узнать, сколько записей было в итого, пока не отображаются дубликаты:
SELECT MIN(ID) AS FirstID,
t.Name,
t.Temp,
COUNT(*) AS Records,
MAX(ID) AS LastID
FROM ( SELECT t.*,
@group:= IF(@temp = t.temp AND @name = t.Name, @group, @group + 1) AS GroupID,
@temp:= t.temp,
@name:= t.Name
FROM YourTable AS t
CROSS JOIN (SELECT @temp := 0, @name := '', @group:= 0) AS v
ORDER BY t.ID
) AS t
GROUP BY t.GroupID, t.Name, t.Temp
ORDER BY t.GroupID;
Пример на БД <> Fiddle
Это может быть избыточно для требований, но это может быть полезно, так как вы можете извлечь гораздо больше информации, чем просто идентифицируя повторяющиеся строки.
Наконец, если / когда вы обновитесь до версии 8.0 или новее, вы сможете использовать ROW_NUMBER()
, или если вы переходите на любую другую СУБД, которая поддерживает ROW_NUMBER()
(что в настоящее время является наиболее распространенной), затем вы можете использовать следующее:
SELECT MIN(ID) AS FirstID,
t.Name,
t.Temp,
COUNT(*) AS Records,
MAX(ID) AS LastID
FROM ( SELECT t.*,
ROW_NUMBER() OVER(ORDER BY ID) -
ROW_NUMBER() OVER(PARTITION BY Temp, Name ORDER BY ID) AS GroupID
FROM YourTable AS t
ORDER BY t.ID
) AS t
GROUP BY t.GroupID, t.Name, t.Temp
ORDER BY t.GroupID;
Пример на БД <> Fiddle