2011-08-22 54 views
2

我有一個表客戶和100行。在表中爲活動/非活動客戶設置狀態列。以統一順序選擇行

我想要做的是選擇表中的所有客戶特定的順序 即

前7個活躍客戶,然後3級不活躍的客戶7再次活躍客戶和3個非活動等

如何我可以在查詢中實現這一點嗎?

我正在使用sql server 2008。請幫助我....

+1

除了狀態列之外,您還有另外一列,可以讓您輕鬆區分行嗎? –

回答

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) 
+0

+1。幹得好,先生。出於好奇,我在這裏測試了一個大型數據集。很酷。 – Bill

+0

感謝您的快速解答..它像一個魅力工作...酷 – shibin

+0

@damien驚人!很好的回答!謝謝 –

0

據我所知,你不能。它可能會要求你曾經有過的SQL

0

檢索它,如果你只有100行,那麼也許極限X1的數據的處理,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

SQL Server中沒有'限制' –

+0

感謝您的回答。例如,我告訴100,實際上表中可能有數千行 – shibin