मेरे पास इस तरह की एक टेबल है

+-----+-----+-----+-----+
|att1 | att2| att3|  id |
+-----------------------+
| a   |  b  |  a  |  1  |
| b   |  c  |  c  |  2  |
| a   |  b  |  a  |  3  |
+-----------------------+

कुछ कॉलम और एक आईडी के साथ। मैं उस आईडी को एक नई आईडी से बदलना चाहता हूं जो बराबर है अगर att1, att2 और att3 बराबर हैं, जैसे:

+-----+-----+-----+-----+
|att1 | att2| att3|  id |
+-----------------------+
| a   |  b  |  a  |  1  |
| b   |  c  |  c  |  2  |
| a   |  b  |  a  |  1  |
+-----------------------+

मैंने इस तरह से विशेषताओं पर एक घने_रैंक () फ़ंक्शन के साथ कथन में शास्त्रीय विलय की कोशिश की:

merge into the_table t
using (
  select att1, att2, att3, dense_rank() over (partition by att1, att2, att3 order by att1) as rnk
  from the_table 
) x on (x.att1 = t.att1 and x.att2 = t.att2 and t.att3 = x.att3)
when matched then update
   set old_id = x.new_id;

लेकिन यह काम नहीं करता है, क्योंकि select att1, att2, att3, dense_rank() over (partition by att1, att2, att3 order by att1) as rnk att1, att2 और att3 के प्रत्येक विभाजन को मेरी अपेक्षा के अनुरूप अपनी रैंक नहीं देता है, बल्कि सब कुछ सिर्फ रैंक 1 प्राप्त करता है।

मैं क्या गलत कर रहा हूं?

1
krise 15 जुलाई 2020, 11:28

2 जवाब

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

मेरे अपने प्रश्न का उत्तर देना:

रैंक फ़ंक्शन के साथ चयन इस तरह दिखना चाहिए, फिर यह अपेक्षा के अनुरूप काम करता है

select att1, att2, att3, dense_rank() over (order by att1, att2, att3) as rnk

तो उन विशेषताओं को रखना जो समान रैंक प्राप्त करना चाहिए, इसके बजाय विभाजन के क्रम में

2
krise 15 जुलाई 2020, 11:43

यह सिर्फ एक और विकल्प है-

डेमो यहाँ

SELECT A.att1,A.att2,A.att3, B.RN id
FROM your_table A
INNER JOIN (
    SELECT att1,att2,att3,
    ROW_NUMBER() OVER (ORDER BY att1,att2,att3) RN
    FROM your_table
    GROUP BY att1,att2,att3
)B ON A.att1 = B.att1 AND A.att2 = B.att2 AND A.att3 = B.att3
ORDER BY A.Id
3
mkRabbani 15 जुलाई 2020, 11:52