сортировать элементы по их количеству - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть такие данные

д б с

д

с б

б

с

c a d

с

если вы проанализируете, вы найдете внешний вид каждого элемента следующим образом

а: 4 б: 3 с: 5 д: 2

По внешнему виду мои отсортированные элементы будут с, а, б, г * * тысяча двадцать-одна

и конечный результат должен быть

c b d

д

с б

б

с

c a d

с

Любая подсказка, как мы можем добиться этого с помощью SQL-запроса?

1 Ответ

0 голосов
/ 23 апреля 2010

Если нет другого столбца, который задает порядок входных строк, будет невозможно гарантировать, что выходные строки возвращаются в том же порядке.Я сделал здесь предположение, чтобы упорядочить их по трем столбцам, чтобы результат был детерминированным.

Вероятно, можно будет сжать этот код за меньшее количество шагов, но покажет шаги достаточно четко.*

Обратите внимание, что для большого набора данных может быть более эффективно разделить некоторые из этих шагов на SELECT INTO операции, создающие временные таблицы или рабочие таблицы.

DECLARE @t TABLE
(col1 CHAR(1)
,col2 CHAR(1)
,col3 CHAR(1)
)

INSERT @t
      SELECT 'd','b','c'
UNION SELECT 'a','d',NULL
UNION SELECT 'c','b',NULL
UNION SELECT 'a','b',NULL
UNION SELECT 'c','a',NULL
UNION SELECT 'c','a','d'
UNION SELECT 'c',NULL,NULL


;WITH freqCTE
AS
(
        SELECT col1 FROM @t WHERE col1 IS NOT NULL

        UNION ALL

        SELECT col2 FROM @t WHERE col2 IS NOT NULL

        UNION ALL

        SELECT col3 FROM @t WHERE col3 IS NOT NULL        
)
,grpCTE
AS
(
        SELECT  col1    AS val
                ,COUNT(1) AS cnt
        FROM freqCTE
        GROUP BY col1

)
,rowNCTE
AS
(
                 SELECT *
                        ,ROW_NUMBER() OVER (ORDER BY col1
                                                     ,col2
                                                     ,col3
                                           ) AS rowN
                 FROM @t
)
,buildCTE
AS
(
        SELECT rowN
               ,val
               ,cnt
               ,ROW_NUMBER() OVER (PARTITION BY rowN
                                   ORDER BY     ISNULL(cnt,-1) DESC
                                               ,ISNULL(val,'z') 
                                   ) AS colOrd
        FROM (                           
                SELECT *
                FROM            rowNCTE  AS t
                JOIN            grpCTE   AS g1
                ON              g1.val = t.col1

                UNION ALL

                SELECT *
                FROM            rowNCTE  AS t
                LEFT JOIN       grpCTE   AS g2
                ON              g2.val = t.col2

                UNION ALL

                SELECT *
                FROM            rowNCTE  AS t
                LEFT JOIN       grpCTE   AS g3
                ON              g3.val = t.col3
            ) AS x
)
SELECT b1.val  AS col1
       ,b2.val AS col2
       ,b3.val AS col3
FROM buildCTE AS b1
JOIN buildCTE AS b2
ON   b2.rowN   = b1.rowN
AND  b2.colOrd = 2
JOIN buildCTE AS b3
ON   b3.rowN   = b1.rowN
AND  b3.colOrd = 3
WHERE b1.colOrd = 1
ORDER BY b1.rowN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...