這些解決方案(ROW_NUMBER/LAG)會爲MySQL 8.0+或MariaDB的工作10.2
你可以使用ROW_NUMBER()
並加入到上一行:
CREATE TABLE tab(ID INT ,Source_ID INT);
INSERT INTO tab(id, Source_id)
SELECT 10, 1
UNION ALL SELECT 20 , 2
UNION ALL SELECT 30, 2
UNION ALL SELECT 40 , 3
UNION ALL SELECT 50 , 3
UNION ALL SELECT 60 , 3
UNION ALL SELECT 70 , 4;
WITH cte AS (
SELECT *, ROW_NUMBER() OVER(ORDER BY id) AS rn
FROM tab
)
SELECT c1.ID,
CASE WHEN c1.Source_ID = c2.Source_ID THEN c2.Id END AS Parent_Id,
c1.Source_ID
FROM cte c1
LEFT JOIN cte c2
ON c1.rn = c2.rn+1;
Rextester Demo
編輯:
使用LAG()
窗口函數:
SELECT c1.ID,
CASE
WHEN c1.Source_ID = LAG(Source_ID) OVER w THEN LAG(ID) OVER w
END AS Parent_Id,
c1.Source_ID
FROM tab c1
WINDOW w AS (ORDER BY ID)
ORDER BY id;
DBFiddle
EDIT2: Simulati NG LAG
使用變量:
SET @lag_Source_id='';
SET @lag_Id = '';
SELECT ID,
CASE WHEN Source_Id = lag_Source_ID THEN lag_ID END AS Parent_ID
,Source_ID
FROM (
SELECT ID
, Source_ID
, @lag_Source_id AS lag_Source_id
, @lag_Source_id:= Source_ID AS curr_Source_ID
, @lag_Id AS lag_ID
, @lag_Id := ID AS curr_ID
FROM tab
ORDER BY id
) AS sub
RextesterDemo2
我刪除了不兼容的數據庫標籤。請標記您真正使用的數據庫。 –
如果你正在使用SQL Server,簡單'Lag()OVER(Partition By)'可以解決你的問題 – LONG
在這個問題中,基本上所有的第一個元素爲Parent是null,其中source是相同的。我對麼? – crook