आप एक (अस्थायी) MyISAM . बना सकते हैं AUTO_INCREMENT rank
के साथ तालिका समग्र प्राथमिक कुंजी में स्तंभ। इस तरह rank
प्रति ID
. में एक क्रम होगा जब आप तालिका को अलग (id, item_code)
. से भरते हैं संयोजन। फिर आप मूल डेटा के साथ उस तालिका में शामिल हो सकते हैं।
CREATE TEMPORARY TABLE tmp_rank(
id INT,
item_code varchar(50),
rank INT AUTO_INCREMENT,
PRIMARY KEY (id, rank)
) engine=MyISAM
SELECT DISTINCT NULL as rank, id, item_code
FROM test t
-- WHERE <several filters>
ORDER BY id, item_code
;
SELECT t.*, x.rank
FROM tmp_rank x
JOIN test t USING(id, item_code)
-- WHERE <several filters>
यदि आप इसे एक ही प्रश्न में चाहते हैं, तो आप इसे आजमा सकते हैं:
SELECT id, item_code,
CASE
WHEN id = @curId AND item_code = @curCode
THEN @curRank
WHEN id <> @curId THEN @curRank := 1
ELSE @curRank := @curRank + 1
END AS rank,
@curId := id,
@curCode := item_code
FROM test t
CROSS JOIN (SELECT
@curRank := 0,
cast(@curCode := null as signed),
cast(@curId := NULL as char)
) r
#WHERE <several filters>
ORDER BY id, item_code
सावधान रहें, कि SQL कथन में संचालन का मूल्यांकन क्रम परिभाषित नहीं है। इसलिए जब आप एक ही स्टेटमेंट में यूजर वेरिएबल को पढ़ते और लिखते हैं, तो आप कार्यान्वयन विवरण पर निर्भर होते हैं।
MySQL 8 . में या MariaDB 10.2 यह होगा:
SELECT id, item_code,
DENSE_RANK() OVER (PARTITION BY id ORDER BY item_code) as `rank`
FROM test t
-- WHERE <several filters>