+----+-------+
| id | value | 
+----+-------+
|  1 |    A  |
|  2 |    B  |
|  3 |    C  |
|  4 |    D  |
|  5 |    D  |
|  6 |    D  |
|  7 |    N  |
|  8 |    P  |
|  9 |    P  |
+----+-------+

वांछित आउटपुट

+----+-------+---------------------+
| id | value |      calc ↓         |
+----+-------+---------------------+
|  1 |    A  |          1          |
|  2 |    B  |          2          |
|  3 |    C  |          3          |
|  4 |    D  |          6          |
|  5 |    D  |          6          |
|  6 |    D  |          6          |
|  7 |    N  |          7          |
|  8 |    P  |          9          |
|  9 |    P  |          9          |
| 10 |    D  |          11         |
| 11 |    D  |          11         |
| 12 |    Z  |          12         |
+----+-------+---------------------+

क्या आप इसके समाधान के लिए मेरी मदद कर सकते हैं? आईडी पहचान है, आईडी आउटपुट में मौजूद होनी चाहिए, आउटपुट में समान 9 पंक्तियां होनी चाहिए।

नया नोट: मैंने 10,11,12 पंक्तियाँ जोड़ीं। ध्यान दें कि आईडी 10 और 11 जिसमें 'डी' अक्षर है, आईडी 4,5,6 . से अलग समूह में है

धन्यवाद

-2
lozin 25 अक्टूबर 2020, 13:13

3 जवाब

सबसे बढ़िया उत्तर

यदि समूहीकरण आसपास के आईडी पर भी निर्भर करता है तो यह अंतराल और द्वीपों की समस्या में बदल जाता है https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-sql-of-gaps-and-islands- in-sequences/#:~:text=The%20SQL%20of%20Gaps%20and%20Islands%20in%20Sequences,...%204%20Performance%20Comparison%20of%20Gaps%20Solutions.%20

आप Tabibitosan विधि का उपयोग कर सकते हैं https://rwijk.blogspot.com/2014/01/ tabibitosan.html

यहां आपको अपने मूल्य कॉलम के आधार पर समूह बनाने की भी आवश्यकता है, लेकिन यह इसे बहुत अधिक जटिल नहीं करता है:

select id, value, max(id) over (partition by value, island) calc
from (
select id, value, id - row_number() over(partition by value order by id) island
from my_table
) as sq
order by id;

id - row_number() over(partition by value order by id) व्यंजक आपको एक संख्या देता है जो हर बार मूल्य के प्रत्येक मान के लिए आईडी मान में 1 से अधिक परिवर्तन करने पर बदल जाता है। यह max(id) over (partition by value, island) व्यंजक में शामिल हो जाता है। द्वीप संख्या केवल उस विशेष मान के लिए मान्य है। आपके मामले में, N और D दोनों मानों की गणना द्वीप संख्या 6 है, लेकिन उन्हें अलग तरह से विचार करने की आवश्यकता है।

Db-fiddle https://www.db-fiddle.com/f/jahP7T6xBt3cpbLRhZZdQG/1

1
Andrew Sayer 25 अक्टूबर 2020, 14:25

इस नमूना तिथि के लिए आपको MAX() विंडो फ़ंक्शन की आवश्यकता है:

SELECT id, value,
       MAX(id) OVER (PARTITION BY value) calc
FROM tablename
1
forpas 25 अक्टूबर 2020, 13:19
SELECT id, value, (SELECT max(id) FROM TABLE inner where inner.value = outer.value)
FROM table as outer
0
Tordek 25 अक्टूबर 2020, 13:16