Удалять дубликаты в большой базе данных MySQL по времени, отличающемуся в xsecound
Я смотрел на другой вопрос с похожей темой, но он не решает проблему, которую я в настоящее время имею в следующей таблице.
action_table(actionid,cookieid,intime,page)
У меня есть данные, как следует
235470 ,994341855.1473047915, 2016-09-05 07:01:57, index.aspx
235471, 994341855.1473047915, 2016-09-05 07:02:00, index.aspx
235472, 994341855.1473047915, 2016-09-05 07:02:02, index.aspx
235473, 994341855.1473047915, 2016-09-05 07:02:12, home.aspx
235474, 994341855.1473047915, 2016-09-05 07:04:12, index.aspx
Пользователь может неограниченное время обновить свою страницу, он должен быть дубликатом, как следует, поэтому только автоинкремент (actionid
) и intime
только отличается, поэтому я просто хочу получить данные, как следует
235470 ,994341855.1473047915, 2016-09-05 07:01:57, index.aspx
235473, 994341855.1473047915, 2016-09-05 07:02:12, home.aspx
235474, 994341855.1473047915, 2016-09-05 07:04:12, index.aspx
Избегайте повторяющихся записей, таких как идентификатор куки и страница одинакова, а также, если между этой же страницей есть какая-либо страница, то это должна быть новая запись.
Как можно выбрать как этот запрос? Есть ли какая-либо группировка доступна? пожалуйста, помогите мне
2 ответа
Схема
create table action_table
( actionid int not null,
cookieid decimal(20,10) not null,
intime datetime not null,
page varchar(100) not null
)charset=utf8 engine=InnoDB;
insert action_table values
(235470 ,994341855.1473047915, '2016-09-05 07:01:57', 'index.aspx'),
(235471, 994341855.1473047915, '2016-09-05 07:02:00', 'index.aspx'),
(235472, 994341855.1473047915, '2016-09-05 07:02:02', 'index.aspx'),
(235473, 994341855.1473047915, '2016-09-05 07:02:12', 'home.aspx'),
(235474, 994341855.1473047915, '2016-09-05 07:04:12', 'index.aspx');
запрос
select actionid,cookieid,intime,page
from
( select actionid,cookieid,intime,page,
@num := if(@page = page, 2, 1) as thePage,
@page := `page` as dummy
from action_table
cross join (select @page:='',@num:=0) xParams
order by actionid,cookieid,intime,page
) as x
where x.thePage=1
order by actionid,cookieid,intime,page;
+----------+----------------------+---------------------+------------+
| actionid | cookieid | intime | page |
+----------+----------------------+---------------------+------------+
| 235470 | 994341855.1473047915 | 2016-09-05 07:01:57 | index.aspx |
| 235473 | 994341855.1473047915 | 2016-09-05 07:02:12 | home.aspx |
| 235474 | 994341855.1473047915 | 2016-09-05 07:04:12 | index.aspx |
+----------+----------------------+---------------------+------------+
Использует переменные MySQL с производной таблицей x
где, если переменная @num
это 1, мы возьмем его для конечного результата.
cross join
просто для инициализации переменных в начале.
Вот решение, использующее аналитическую функцию LEAD в Oracle:
WITH input_data AS (
SELECT 235470 AS actionid, 994341855.1473047915 AS cookieid, TO_DATE('2016-09-05 07:01:57', 'yyyy-mm-dd HH:MI:SS') AS intime, 'index.aspx' AS page FROM DUAL
UNION ALL
SELECT 235471 AS actionid, 994341855.1473047915 AS cookieid, TO_DATE('2016-09-05 07:02:00', 'yyyy-mm-dd HH:MI:SS') AS intime, 'index.aspx' AS page FROM DUAL
UNION ALL
SELECT 235472 AS actionid, 994341855.1473047915 AS cookieid, TO_DATE('2016-09-05 07:02:02', 'yyyy-mm-dd HH:MI:SS') AS intime, 'index.aspx' AS page FROM DUAL
UNION ALL
SELECT 235473 AS actionid, 994341855.1473047915 AS cookieid, TO_DATE('2016-09-05 07:02:12', 'yyyy-mm-dd HH:MI:SS') AS intime, 'home.aspx' AS page FROM DUAL
UNION ALL
SELECT 235474 AS actionid, 994341855.1473047915 AS cookieid, TO_DATE('2016-09-05 07:04:12', 'yyyy-mm-dd HH:MI:SS') AS intime, 'index.aspx' AS page FROM DUAL
)
SELECT MIN(actionid) AS action_id, cookieid, MIN(intime) AS intime, page
FROM (
SELECT input_data.*, LEAD(page, 1) OVER (ORDER BY intime) AS next_page
FROM input_data
)
WHERE page <> NVL(next_page, 'NULL')
GROUP BY cookieid, page, next_page
ORDER BY MIN(actionid)
;
Выход:
ACTION_ID COOKIEID INTIME PAGE
235472 994341855.1 05/09/2016 07:02 index.aspx
235473 994341855.1 05/09/2016 07:02 home.aspx
235474 994341855.1 05/09/2016 07:04 index.aspx