2017-07-26 47 views
0

我需要你的幫助。我有一個名爲Test_Result的表格,具有2列,如下所示。SQL查詢找到新列

ID Source_ID 
10 1 
20 2 
30 2 
40 3 
50 3 
60 3 
70 4 

我想獲得如下輸出,但無法獲得邏輯。

ID Parent_ID Source_ID 
10 Null   1 
20 Null   2 
30 20   2 
40 Null   3 
50 40   3 
60 50   3 
70 Null   4 

請幫我解決這個問題。我在圖片中附加了問題。

問候, ABHI

enter image description here

+1

我刪除了不兼容的數據庫標籤。請標記您真正使用的數據庫。 –

+1

如果你正在使用SQL Server,簡單'Lag()OVER(Partition By)'可以解決你的問題 – LONG

+0

在這個問題中,基本上所有的第一個元素爲Parent是null,其中source是相同的。我對麼? – crook

回答

0

這些解決方案(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

+0

我在MySQL上運行它,所以不要認爲與cte工作。 – Abhi

+0

CTE/ROW_NUMBER可從MySQL 8.0或MariaDB獲得(http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=97e923ea97dd6a1f82921678175052af) – lad2025

+0

無法:出現錯誤,錯誤代碼:1064.您的SQL語法出錯; ( )SELECT *,ROW_NUMBER()OVER(ORDER BY id)ASFROM標籤 – Abhi

0
簡單的做到這些

如果你使用MySQL數據庫,

SELECT ID, (ID + Source_ID) AS Parent_ID, Source_ID FROM tableName LIMIT 10; 
+0

我們需要使用一些邏輯創建parent_id字段。 – Abhi

+0

邏輯:如果parent_id最初不存在於表中,則需要將某個值解析爲parent_id。例如SELECT ID,(ID + Source_ID)作爲Parent_ID,Source_ID從表名LIMIT 10 – Lekens

+0

記錄1st,如果source_id是1,則parent_id將爲空,因爲它是第一個和唯一唯一的source_id。對於記錄2nd,如果我們在這裏有2個source_id 2,那麼對於第2行,父ID將爲空,因爲它是該組的第一個記錄,並且第3條記錄將具有父ID,與20相同。請讓我知道如果仍然不清楚。 – Abhi