मुझे आपकी मदद चाहिए। मेरे पास नीचे दिखाए गए अनुसार 2 कॉलम के साथ Test_Result नाम की एक तालिका है।

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

कृपया इस परिदृश्य में मेरी मदद करें। मैंने चित्र के लिए भी प्रश्न संलग्न किया है।

सादर, अभि

enter image description here

0
Abhi 26 जुलाई 2017, 15:29
1
मैंने असंगत डेटाबेस टैग हटा दिए हैं। कृपया उस डेटाबेस के साथ टैग करें जिसका आप वास्तव में उपयोग कर रहे हैं।
 – 
Gordon Linoff
26 जुलाई 2017, 15:30
1
यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो सरल Lag()OVER(Partition By) आपकी समस्या का समाधान कर सकता है
 – 
LONG
26 जुलाई 2017, 15:35
इस समस्या में मूल रूप से माता-पिता के लिए सभी पहला तत्व शून्य है जहां स्रोत समान है। क्या मैं सही हूँ?
 – 
not_python
26 जुलाई 2017, 15:36
stackoverflow.com/ प्रश्न/16660169/… इस लिंक को चेक करें
 – 
not_python
26 जुलाई 2017, 15:45
पहले तत्व के लिए हाँ माता-पिता शून्य होंगे लेकिन बाकी तर्क के लिए व्युत्पन्न करना होगा।
 – 
Abhi
26 जुलाई 2017, 16:14

2 जवाब

ये समाधान (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


संपादित करें2: चर का उपयोग करके 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
Lukasz Szozda 26 जुलाई 2017, 16:20
मैं इसे MySQL पर चला रहा हूं इसलिए सीटीई काम के साथ मत सोचो।
 – 
Abhi
26 जुलाई 2017, 15:47
CTE/ROW_NUMBER MySQL 8.0 या MariaDB से उपलब्ध हैं (dbfiddle.uk/…)
 – 
Lukasz Szozda
26 जुलाई 2017, 15:48
असमर्थ: त्रुटि प्राप्त करना, त्रुटि कोड: 1064 के रूप में। आपको अपने SQL सिंटैक्स में त्रुटि है; 'WITH cte AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY id) AS RN FROM टैब के पास उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाने वाले मैनुअल की जाँच करें
 – 
Abhi
26 जुलाई 2017, 15:58
संपादित भी काम नहीं कर रहा है। उपयोग किए गए फ़ंक्शन पर त्रुटि देना। त्रुटि कोड: 1305। समारोह अंतराल मौजूद नहीं है
 – 
Abhi
26 जुलाई 2017, 16:00
कृपया प्रश्न में MySQL का अपना संस्करण निर्दिष्ट करें। select version() as 'mysql version'
 – 
Lukasz Szozda
26 जुलाई 2017, 16:01

यदि आप MySQL डेटाबेस का उपयोग कर रहे हैं तो बस यह करें,

SELECT ID, (ID + Source_ID) AS Parent_ID,   Source_ID FROM tableName LIMIT 10;
0
Lekens 26 जुलाई 2017, 16:21
हमें कुछ तर्क का उपयोग करके parent_id फ़ील्ड बनाने की आवश्यकता है।
 – 
Abhi
26 जुलाई 2017, 16:12
तर्क: यदि प्रारंभ में तालिका पर parent_id मौजूद नहीं है, तो आपको कुछ मान को parent_id के रूप में हल करने की आवश्यकता है। जैसे सेलेक्ट आईडी, (आईडी + सोर्स_आईडी) पेरेंट_आईडी के रूप में, सोर्स_आईडी फ्रॉम टेबलनाम LIMIT 10
 – 
Lekens
26 जुलाई 2017, 16:20
रिकॉर्ड 1 के लिए, यदि source_id 1 है तो parent_id शून्य हो जाएगा क्योंकि यह पहला और एकल अद्वितीय source_id है। रिकॉर्ड 2 के लिए, यदि हमारे पास 2 source_id यहां 2 है तो पंक्ति 2 के लिए मूल आईडी शून्य होगी क्योंकि यह उस समूह का पहला रिकॉर्ड है और तीसरे रिकॉर्ड में पैरेंट आईडी 20 होगी। बाकी के साथ भी यही होता है। कृपया मुझे बताएं कि क्या यह अभी भी स्पष्ट नहीं है।
 – 
Abhi
26 जुलाई 2017, 16:22