2016-07-28 61 views
-1
 id| type | datetime | 
    ---| ---------|--------------| 
    1 | admin | 2016-01-03 | 
    2 | user  | 2016-01-07 | 
    3 | user  | 2016-01-08 | 
    4 | admin | 2016-01-04 | 
    5 | user  | 2016-01-01 | 
    6 | user  | 2016-01-03 | 
    7 | user  | 2016-01-05 | 
    8 | user  | 2016-01-09 | 

可以說我有一個表,我需要根據日期時間重新排列它。第一條記錄必須來自管理員,其中最新的日期時間僅限於管理員類型。然後第二個到第五個記錄必須從用戶排序的類型中按照它們的日期時間降序排列。然後再次,第六條記錄必須從第二個最新的日期時間的管理類型。查詢的預期結果顯示在下表中。SQL Server根據日期時間和用戶類型選擇記錄

預期結果:

 id| type | datetime | 
    ---| ---------|--------------| 
    4 | admin | 2016-01-04 | 
    8 | user  | 2016-01-09 | 
    3 | user  | 2016-01-08 |   
    2 | user  | 2016-01-07 | 
    1 | admin | 2016-01-03 | 
    7 | user  | 2016-01-05 | 
    6 | user  | 2016-01-03 | 
    5 | user  | 2016-01-01 | 

你們可以給我如何編寫查詢來獲得期望的結果一些想法?

+1

這是一個繼續的事情還是隻是這9行? –

+1

這是一個非常不尋常的要求,你能告訴我們爲什麼你想這麼做嗎?也不清楚你已經嘗試了什麼。 –

+0

雅,這是一個繼續的事情。這9行僅僅是示例。 – JK9

回答

2

我發現了一個辦法做到這一點而不NTILE的問題時,你的計數不是你想組的用戶的數量整除。基於gofr1的腳本,這是我建議你使用的:

SELECT id, 
     [type], 
     [datetime] 
FROM (
    SELECT id, 
      [type], 
      [datetime], 
      ROW_NUMBER() OVER (ORDER BY [datetime]) - 1 Idx 
    FROM YourTable 
    WHERE [type] = 'admin' 
    UNION ALL 
    SELECT id, 
      [type], 
      [datetime], 
      FLOOR((ROW_NUMBER() OVER (ORDER BY [datetime]) - 1)/3) Idx 
    FROM YourTable 
    WHERE [type] = 'user' 
    ) as p 
ORDER BY Idx, [type] 
+0

哇,它也在工作,你的代碼比@ gofr1代碼更容易理解,謝謝你的努力。真的很感激它。 – JK9

+1

不錯的一個!最好接受這個答案:) – gofr1

+0

其實用NTILE你會得到不同的結果,這取決於你的計數。例如,如果你有10個用戶,NTILE(2)會給5-5,NTILE(3)會給你4-3-3,NTILE(4)會給你3-3-2-2。沒有選擇會給你3-3-3-1。 – Andrew

3

你可以在樣使用NTILE在它下面2組分配行,然後你只需要通過組號和日期時間訂購吧:

SELECT id, 
     [type], 
     [datetime] 
FROM (
    SELECT id, 
      [type], 
      [datetime], 
      NTILE(2) OVER (ORDER BY [datetime] DESC) as NT 
    FROM YourTable 
    WHERE [type] = 'admin' 
    UNION ALL 
    SELECT id, 
      [type], 
      [datetime], 
      NTILE(2) OVER (ORDER BY [datetime] DESC) as NT 
    FROM YourTable 
    WHERE [type] = 'user' 
    ) as p 
ORDER BY NT, [type] 

輸出:

id type datetime 
4 admin 2016-01-04 
8 user 2016-01-09 
3 user 2016-01-08 
2 user 2016-01-07 
1 admin 2016-01-03 
7 user 2016-01-05 
6 user 2016-01-03 
5 user 2016-01-01 

注:如果您需要動態確定組編號(根據行數計算),可以使用以下代碼:

DECLARE @i int 

SELECT @i = --some number 

NTILE(@i) OVER (ORDER BY ... 

我建議使用:

SELECT @i = CAST(CASE WHEN COUNT(*)%4.00 = 1 THEN ROUND(COUNT(*)/4.00,0)+1 ELSE ROUND(COUNT(*)/4.00,0) END as int) 
FROM YourTable 
+0

我可以讓它總是從管理員開始,然後是3個用戶? – JK9

+0

它不是?我檢查了你提供的示例,並且可以在輸出中看到它按需要訂購。 – gofr1

+0

剛纔我試圖改變NTILE中的值,之後工作..非常感謝你。 – JK9