GROUP_CONCAT, MySQL tarafından sunulan bir toplama işlevidir. Bu işlev, GROUP BY kullanılarak oluşturulan her gruptaki birden çok satırın sütun değerlerini tek bir bağımsız dizede birleştirmek için kullanılır. Birden çok veri kaydını tek bir veri kaydında birleştirmek istediğinizde bu işlevi kullanabilirsiniz. MaxCompute'da GROUP_CONCAT işleviyle aynı etkiyi elde etmek için WM_CONCAT işlevini kullanabilirsiniz.
Örnek
price_total adlı bir tabloda name, price ve saleid sütunları bulunur. Tablo aşağıdaki verileri içerir:
+--------+------------+------------+
| name | price | saleid |
+--------+------------+------------+
| bag | 50 | 1 |
| sugar | 20 | 3 |
| noodle | 2 | 4 |
| potato | 5 | 6 |
| bag | 100 | 2 |
| sugar | 10 | 4 |
| potato | 4 | 3 |
| sugar | 50 | 7 |
| noodle | 2 | 5 |
| noodle | 5 | 1 |
+--------+------------+------------+
Bu örnekte tüm ürünler, tablodaki name sütunu olan ürün adına göre gruplandırılır. Aşağıdaki gereksinimleri karşılamak için MySQL'de GROUP_CONCAT işlevini kullanabilirsiniz:
-
Gereksinim 1: Aynı grubun price sütunundaki değerleri birleştirin. Dönen sonuçlar yinelenen değerler içerir. Örnek ifade:
SELECT name, group_concat(price) FROM price_total GROUP BY name; -
Gereksinim 2: Aynı grubun price sütunundaki değerleri birleştirin. Dönen sonuçlar yinelenen değerler içermez. Örnek ifade:
SELECT name, group_concat(distinct price) FROM price_total GROUP BY name; -
Gereksinim 3: Aynı grubun price sütunundaki değerleri birleştirip sıralayın. Dönen sonuçlar yinelenen değerler içerir. Örnek ifade:
SELECT name, group_concat(price ORDER BY price desc) FROM price_total GROUP BY name; -
Gereksinim 4: Aynı grubun price sütunundaki değerleri birleştirip sıralayın. Dönen sonuçlar yinelenen değerler içermez. Örnek ifade:
SELECT name, group_concat(distinct price ORDER BY price desc) FROM price_total GROUP BY name; -
Gereksinim 5: Aynı grubun price sütunundaki değerlerle saleid sütunundaki değerleri birleştirin. Örnek ifade:
SELECT name, group_concat(concat_ws(':', price, saleid)) FROM price_total GROUP BY name;
Çözüm
MaxCompute, GROUP_CONCAT işlevini desteklemez. Bu örnekteki gereksinimleri karşılamak için WM_CONCAT işlevini kullanabilirsiniz.
WM_CONCAT işlevinin GROUP_CONCAT işlevine eşdeğer olmadığını unutmayın. Aşağıdaki tabloda işlevlerin yetenekleri açıklanmaktadır.
|
Yetkinlik |
WM_CONCAT |
GROUP_CONCAT |
Açıklama |
|
DISTINCT kullanarak yinelenenleri kaldırma |
|
|
Yok. |
|
Ayırıcı |
|
|
Birleştirilecek değerleri bağlamak için ayırıcı kullanılabilir. WM_CONCAT ve GROUP_CONCAT işlevlerinde ayırıcıları kullanırken aşağıdaki noktalara dikkat edin:
|
|
Sıralama |
|
|
Değerleri sıralamak istiyorsanız aşağıdaki yöntemi kullanın:
|
|
Birden çok sütunun birleştirilmesi |
|
|
WM_CONCAT ve GROUP_CONCAT işlevleri, satırları birleştirmek için kullanılan işlevlerdir. Bu iki işlev, farklı gruplardaki birden çok sütunun değerlerini birleştirmek üzere sütunları birleştirmek için kullanılan CONCAT işlevi veya CONCAT_WS işlevi ile birlikte kullanılabilir. |
Önceki tabloda açıklanan işlev yeteneklerine dayanarak aşağıdaki gereksinimleri karşılamak için WM_CONCAT işlevini kullanabilirsiniz:
-
Gereksinim 1: Aynı grubun price sütunundaki değerleri birleştirin. Dönen sonuçlar yinelenen değerler içerir.
SELECT name, wm_concat(',', price) AS price_new FROM price_total GROUP BY name;Aşağıdaki sonuç döner:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 50,100 | | noodle | 2,2,5 | | potato | 5,4 | | sugar | 20,10,50 | +--------+-----------+ -
Gereksinim 2: Aynı grubun price sütunundaki değerleri birleştirin. Dönen sonuçlar yinelenen değerler içermez.
SELECT name, wm_concat(distinct ',', price) AS price_new FROM price_total GROUP BY name;Aşağıdaki sonuç döner:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 100,50 | | noodle | 2,5 | | potato | 4,5 | | sugar | 10,20,50 | +--------+-----------+ -
Gereksinim 3: Aynı grubun price sütunundaki değerleri birleştirip sıralayın. Dönen sonuçlar yinelenen değerler içerir.
-
Yöntem 1:
SELECT name, wm_concat(',', price) WITHIN GROUP (ORDER BY price desc) AS price_new FROM (SELECT name, price FROM price_total) GROUP BY name; -
Yöntem 2:
SELECT name, wm_concat(',', price) AS price_new FROM (SELECT name, price FROM price_total ORDER BY name, price desc LIMIT 100) GROUP BY name; -
Aşağıdaki sonuç döner:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 100,50 | | noodle | 5,2,2 | | potato | 5,4 | | sugar | 50,20,10 | +--------+-----------+
-
-
Gereksinim 4: Aynı grubun price sütunundaki değerleri birleştirip sıralayın. Dönen sonuçlar yinelenen değerler içermez.
-
Yöntem 1:
SELECT name, wm_concat(',', price) within GROUP (ORDER BY price asc) FROM (SELECT DISTINCT name, price FROM price_total) GROUP BY name; -
Yöntem 2:
SELECT name, wm_concat(',', price) AS price_new FROM (SELECT DISTINCT name, price FROM price_total ORDER BY name, price asc LIMIT 100) GROUP BY name; -
Aşağıdaki sonuç döner:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 50,100 | | noodle | 2,5 | | potato | 4,5 | | sugar | 10,20,50 | +--------+-----------+
-
-
Gereksinim 5: Aynı grubun price sütunundaki değerlerle saleid sütunundaki değerleri birleştirin.
SELECT name, wm_concat(',', concat_ws(':',price,saleid)) AS price_new FROM price_total GROUP BY name; -- The preceding statement is equivalent to the following statement: SELECT name, wm_concat(',', concat(price,':',saleid)) FROM price_total GROUP BY name;Aşağıdaki sonuç döner:
+--------+-----------------+ | name | price_new | +--------+-----------------+ | bag | 50:1,100:2 | | noodle | 2:4,2:5,5:1 | | potato | 5:6,4:3 | | sugar | 20:3,10:4,50:7 | +--------+-----------------+
İlgili Kaynaklar
Hive, MySQL ve Oracle yerleşik işlevlerinin MaxCompute'da nasıl uygulanacağı hakkında daha fazla bilgi için bkz. MaxCompute yerleşik işlevleri ile Hive, MySQL ve Oracle yerleşik işlevleri arasındaki eşlemeler.
MaxCompute tarafından sunulan yerleşik işlevler iş gereksinimlerinizi karşılayamıyorsa UDF'ler geliştirebilirsiniz. UDF'ler hakkında daha fazla bilgi için bkz. Genel Bakış.