您可以與MySQL做,但是是相當複雜的,因爲它需要幾個子查詢。
SELECT
name, date_time, org_id, uuid
FROM
(
SELECT
`name`, `date_time`, `org_id`,
(SELECT
sum(step)
FROM
(
SELECT
t1.`name`, t1.`date_time`, t1.`org_id`,
case when exists
(SELECT 1
FROM t AS t2
WHERE t2.`name` = t1.`name`
AND timestampdiff(second, t1.date_time, t2.date_time) < 60
AND t2.date_time > t1.date_time
)
then 0
else 1
end AS step
FROM
t AS t1
) AS ttt
WHERE
ttt.name <= t.name AND ttt.date_time <= ttt.date_time
) AS group_number
FROM
t
) AS ttt2
JOIN
(
SELECT 1 AS group_number, UUID() AS `uuid`
UNION
SELECT 2 AS group_number, UUID() AS `uuid`
UNION
SELECT 3 AS group_number, UUID() AS `uuid`
-- and as many as needed
) u ON u.group_number = ttt2.group_number
ORDER BY
name, date_time ;
您將獲得:
name | date_time | org_id | uuid
:--- | :------------------ | -----: | :-----------------------------------
KK | 2017-01-01 11:37:33 | 1 | 636c0fcf-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:36:34 | 2 | 636c107a-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:36:53 | 2 | 636c107a-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:37:23 | 2 | 636c107a-5d3f-11e7-8f8c-00163ebcde7e
TK | 2017-02-11 01:37:20 | 5 | 636c108d-5d3f-11e7-8f8c-00163ebcde7e
TK | 2017-02-11 01:37:31 | 5 | 636c108d-5d3f-11e7-8f8c-00163ebcde7e
如果要更新,做一個,和更新加入您的原始表。
這由幾個步驟進行。首先,你需要訂購你的數據,並確定此時你需要「改變組」(我把那個叫step
)。這會給你一箇中間表(TTT):
CREATE TABLE ttt AS
SELECT
t1.`name`, t1.`date_time`, t1.`org_id`,
case when
exists
(SELECT 1
FROM t AS t2
WHERE
t2.`name` = t1.`name`
AND timestampdiff(second, t1.date_time, t2.date_time) < 60
AND t2.date_time > t1.date_time
)
then 0
else 1
end AS step
FROM
t AS t1
ORDER BY
`name`, `date_time`, `org_id` ;
表TTT是:
name | date_time | org_id | step
:--- | :------------------ | -----: | ---:
KK | 2017-01-01 11:37:33 | 1 | 1
SK | 2017-04-19 01:36:34 | 2 | 0
SK | 2017-04-19 01:36:53 | 2 | 0
SK | 2017-04-19 01:37:23 | 2 | 1
TK | 2017-02-11 01:37:20 | 5 | 0
TK | 2017-02-11 01:37:31 | 5 | 1
從該表中,每一行,計算SUM(all preceding steps)
。這是由芒完成:
CREATE TABLE ttt2 AS
SELECT
`name`, `date_time`, `org_id`,
(SELECT
sum(step)
FROM
ttt
WHERE
ttt.name <= t.name AND ttt.date_time <= ttt.date_time
) AS group_number
FROM
t
ORDER BY
`name`, `date_time`, `org_id` ;
,你會得到一個第二中間表,我把它叫做tt2
name | date_time | org_id | group_number
:--- | :------------------ | -----: | -----------:
KK | 2017-01-01 11:37:33 | 1 | 1
SK | 2017-04-19 01:36:34 | 2 | 2
SK | 2017-04-19 01:36:53 | 2 | 2
SK | 2017-04-19 01:37:23 | 2 | 2
TK | 2017-02-11 01:37:20 | 5 | 3
TK | 2017-02-11 01:37:31 | 5 | 3
現在,您可以通過連接到的表改變group_number
到UUID (1,UID1),(2,UID2)等的元組:
SELECT
name, date_time, org_id, uuid
FROM
ttt2
JOIN
(
SELECT 1 AS group_number, UUID() AS `uuid`
UNION
SELECT 2 AS group_number, UUID() AS `uuid`
UNION
SELECT 3 AS group_number, UUID() AS `uuid`
UNION
SELECT 4 AS group_number, UUID() AS `uuid`
-- and as many as you might need
) u ON u.group_number = ttt2.group_number
ORDER BY
name, date_time ;
你終於得到你想要的東西
name | date_time | org_id | uuid
:--- | :------------------ | -----: | :-----------------------------------
KK | 2017-01-01 11:37:33 | 1 | 636bd83f-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:36:34 | 2 | 636bd8b9-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:36:53 | 2 | 636bd8b9-5d3f-11e7-8f8c-00163ebcde7e
SK | 2017-04-19 01:37:23 | 2 | 636bd8b9-5d3f-11e7-8f8c-00163ebcde7e
TK | 2017-02-11 01:37:20 | 5 | 636bd8c8-5d3f-11e7-8f8c-00163ebcde7e
TK | 2017-02-11 01:37:31 | 5 | 636bd8c8-5d3f-11e7-8f8c-00163ebcde7e
通過用最後一個SQL的定義代替ttt2
和ttt
,你可以在一個查詢中得到你想要的東西......雖然是「怪物一個」。
注意:這個查詢可能會非常低效;而且,如果您正在進行編程,您可能只需循環訪問已排序的數據並確定何時需要生成新的UUID。
您可以檢查一切dbfiddle here
貴表包含一個唯一的ID列標識行? – Barmar
UUID從哪裏來? – Barmar
是的..我有一個自動增量ID列 – Sharvil