Tüm Ürünler
Search
Belge Merkezi

MaxCompute:GROUP_CONCAT işlevinin yeteneklerini uygulama

Son Güncelleme:Oct 04, 2026

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:

  • WM_CONCAT işlevini kullanırken ayırıcılar atlanamaz.

  • GROUP_CONCAT işlevini kullanırken ayırıcılar atlanabilir. Ayırıcılar atlandığında virgül (,) ayırıcı olarak kullanılır.

Sıralama

已开通

已开通

Değerleri sıralamak istiyorsanız aşağıdaki yöntemi kullanın:

  • Birleştirmek istediğiniz alanları önce sıralayın, ardından birleştirin.

  • Kullanıcı tanımlı işlevleri (UDF'ler) kullanın. UDF'ler hakkında daha fazla bilgi için bkz. MaxCompute UDF.

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