2016-07-28 58 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