按统一顺序选择行

时间:2011-08-22 14:21:29

标签: sql select sql-order-by rows

我有一个表客户,其中有100行。为表中的活动/非活动客户设置状态列。

我想要做的是按特定顺序从表格中选择所有客户 即

前7位活跃客户,3位非活跃客户,7位活跃客户,3位非活跃客户等

如何在查询中实现此目的。

我正在使用sql server 2008。请帮助我......

3 个答案:

答案 0 :(得分:2)

这样的事情应该根据你到目前为止列出的最低要求来做到这一点:

;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是表中的其他列,可以对其进行排序。


AlteredOrdering CTE中的神奇数字有望显而易见 - 问题中有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)

答案 1 :(得分:0)

据我所知,你不能。从SQL

中检索数据后,可能需要处理数据

答案 2 :(得分:0)

如果你只有100行,那么可能会限制x,y与union结合可以帮助

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
...