1. SQL / Говнокод #11244

    −119

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    select a, trim(both ',' from max(SYS_CONNECT_BY_PATH(b, ',')))bb from (
      select count(1) over (partition by a order by /* Важно:*/ a,b /*!*/)rn, a, b from (
    
        select a, b from (
          select 1 a, 'a' b from dual union all
          select 1 a, 'b' b from dual union all
          select 2 a, 'c' b from dual union all
          select 2 a, 'd' b from dual union all
          select 2 a, 'e' b from dual union all
          select 3 a, 'f' b from dual
        ) order by dbms_random.value
    
      )
    )
    start with rn=1 connect by nocycle prior a=a and prior rn+1=rn
    group by a;

    Задача на агрегацию с конкатенацией строк. Можно решить правильно - через свой агрегирующий объект, а можно так, "не по правилам" ))

    Запостил: RomaShka, 20 Июня 2012

    Комментарии (10) RSS

    • Ух ты. Таких слов даже подсветка кода не знает.
      Ответить
    • Увидев "/* Важно:*/" - подумал, что у Оракла новые хинты на русском языке.
      А можно еще раз постановку задачи? Только медленно и внятно.
      Ибо из этого "языка для домохозяек" (авторитетное мнение анонимуса нельзя игнорировать) немного неясно, что автор пытается сделать с рандомным сетом данных, особенно в последней внешней обертке, которая уж очень оракл специфик.
      Ответить
      • задача получить строку из значений "b" для каждого "a". Например, конкретный случай даст
        a | bb
        ---+----
        1 | a,b
        2 | c,d,e
        3 | f

        Сортировка по рандому, дабы удостовериться, что из несортированного набора получится упорядоченный результат
        Ответить
      • "у Оракла новые хинты" - спасибо, поржал
        Ответить
    • Сломал мозг.
      Я даже не знаю что хуже - функциональный пиздец haskell-style или декларативный sql, расширенный всякими диалектическими фичами.

      Хотя это
      >start with rn=1 connect by nocycle prior a=a and prior rn+1=rn
      forом пахнет
      Ответить
      • Декларативный SQL конечно же. Хаскель один. Диалектов SQL - десяток.
        Ответить
        • >Хаскель один
          А как же O'Haskell, Haskell++ и Template Haskell? А еще всякие Goffer и другое учебное говно.
          Ответить
    • Я иногда думаю, что запросописатели перекладывают слишком много ненужной работы на сервер баз данных. Оно, конечно, проще так, и даже правильнее слегка. Только вот результаты бывают удручающими.
      Ответить
      • удручабельность же от домохозяйки зависит ;)
        Ответить
    • SQL для домохозяек
      Ответить

    Добавить комментарий