スキップしてメイン コンテンツに移動

MariaDBでSelect Distinctした結果の各行に連番を振る

今回も備忘録としてあげますが、表題の通りにしたいが以下の様にすると、連番を含めてselect distinctするため、期待通りに動いてくれません。
SELECT
	prop_dsc1,
	row_number() OVER (PARTITION BY prop_dsc1 ORDER BY prop_dsc1) venodr_no
FROM art_prop
WHERE prop_name="vendor";


+-----------+-----------+
| prop_dsc1 | venodr_no |
+-----------+-----------+
| ASRock    |         1 |
| ASRock    |         2 |
| ASRock    |         3 |
| ASRock    |         4 |
| ASRock    |         5 |
| MSI       |         1 |
+-----------+-----------+
6 rows in set (0.000 sec)
つまり、select distinctした後に連番をふればいいので、以下の様にします。
SELECT
	t_vendor.vendor,
	row_number() OVER (ORDER BY t_vendor.vendor) vendor_no
FROM
	(
	SELECT distinct prop_dsc1 AS vendor 
	FROM art_prop
	WHERE prop_name="vendor"
	) as t_vendor;
    
+--------+-----------+
| vendor | vendor_no |
+--------+-----------+
| ASRock |         1 |
| MSI    |         2 |
+--------+-----------+    
ところで、PARTITION BYですが、PARTITION BY t_vendor.vendorを入れると、これも期待通りにならないので注意が必要です。
SELECT
	t_vendor.vendor,
	row_number() OVER (PARTITION ORDER BY t_vendor.vendor) vendor_no
FROM
	(
	SELECT distinct prop_dsc1 AS vendor 
	FROM art_prop
	WHERE prop_name="vendor"
	) as t_vendor;

+--------+-----------+
| vendor | vendor_no |
+--------+-----------+
| ASRock |         1 |
| MSI    |         1 |
+--------+-----------+
MariaDB10.5.12で動作確認しました。簡単ですが今回は以上です。それでは。

コメント