【问题标题】:Select Rows in a uniform order以统一的顺序选择行
【发布时间】:2011-08-22 14:21:28
【问题描述】:

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

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

前 7 个活跃客户,然后是 3 个不活跃客户,然后是 7 个活跃客户和 3 个不活跃客户,以此类推

如何在查询中实现这一点。

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

【问题讨论】:

  • 除了状态列之外,您是否还有另一列可以让您轻松区分行?

标签: sql select sql-order-by rows


【解决方案1】:

根据您迄今为止列出的最低要求,应该这样做:

;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 表示数学。干得好,先生。出于好奇,我在这里的一个大型数据集上对其进行了测试。很酷。
  • 感谢您的快速回答。它就像一个魅力......很酷
【解决方案2】:

据我所知,你不能。一旦您从 SQL 中检索到数据,它可能需要处理数据

【讨论】:

    【解决方案3】:

    如果你只有 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
    ...
    

    【讨论】:

    • 感谢您的回答。例如,我告诉像 100 实际上表中可能有数千行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多