Выберите строки в едином порядке - PullRequest
2 голосов
/ 22 августа 2011

У меня есть таблица клиентов и 100 строк в ней.в таблице установлен столбец статуса для активного / неактивного клиента.

Я хочу выбрать всех клиентов из таблицы в определенном порядке, например:

сначала 7 активных клиентов, затем 3 неактивных клиента, снова 7 активных клиентов и 3 неактивных и т. Д.

Как мне добиться этого в запросе.

Я использую SQL Server 2008.Пожалуйста, помогите мне ....

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Примерно так и должно быть, исходя из минимальных требований, которые вы перечислили:

;with NumberedRows as (
    select
        *, --TODO - pick columns
        ROW_NUMBER() OVER(PARTITION BY status ORDER BY PKID) - 1 as rn
    from
        table
), AlteredOrdering as (
    select
        *, --TODO - pick columns
        CASE
            WHEN status = 'active' THEN (10 * (rn/7)) + (rn % 7)
            WHEN status = 'inactive' THEN (10 * (rn/3)) + 7 + (rn % 3)
        END as FinalOrder
    from NumberedRows
)
select * from AlteredOrdering ORDER BY FinalOrder

Очевидно, изменив имена таблиц и столбцов в зависимости от ситуации. PKID предполагается, что это какой-то другой столбец в таблице, по которому можно упорядочить отдельные строки.


Магические числа в CTE AlteredOrdering, как мы надеемся, очевидны - 7 и 3 взяты из вопроса и представляют, сколько каждого элемента должно появиться в каждой «группе». 10 - это общий размер каждой «группы». Таким образом, если бы это было 9 активных, 4 неактивных, выражение CASE выглядело бы так:

WHEN status = 'active' THEN (13 * (rn/9)) + (rn % 9)
WHEN status = 'inactive' THEN (13 * (rn/4)) + 9 + (rn % 4)
0 голосов
/ 22 августа 2011

, если у вас есть только 100 строк, возможно, ограничение x, y в сочетании с объединением может помочь

select * from table where status=active limit 0,7
union
select * from table where status=inactive limit 7,3
union
select * from table where status=active limit 10,7
union
select * from table where status=inactive limit 17,3
...
0 голосов
/ 22 августа 2011

Насколько я знаю, вы не можете. Скорее всего, потребуется обработка данных после того, как вы получили их из SQL

...