2016-01-20 14 views
1

我有以下表(namesTbl):使用SQL NEWID()多一個爲了

id  name  priority 
----------------------------------- 
1  Steve  2 
2  John  3 
3  Carol  1 
4  Peter  2 
5  Mike  1 

運行)的存儲過程,其中namesTbl由NEWID(有序然後我拿到後,讓我們說,以下。

id  name  priority 
----------------------------------- 
4  Peter  2 
2  John  3 
5  Mike  1 
1  Steve  2 
3  Carol  1 

我的問題是,我如何訂購第一行只能始終優先1?其餘的行應該隨機選擇。在這種情況下,第一行必須是Mike或Carol,因爲兩者的優先級都是1 ... !!

謝謝

+0

你的過程是做什麼的?我認爲你應該在那裏實現它。 – sagi

+0

你說Mike或Carol--我們如何選擇? – Paddy

+0

我的存儲過程randomize namesTbl(使用newid())並將新訂單插入到另一個表中 – Gloria

回答

3

試試這個:

Select id, name, priority 
    From (SELECT id, name, priority, newPriority 
      FROM (select id, name, priority, -1 as newPriority, 
         row_number() over (order by priority) as rn 
        from namesTBL) tbl 
     WHERE rn = 1 
     UNION 
     SELECT id, name, priority, RAND(100) newPriority 
      FROM (select id, name, priority, 1 as newPriority, 
         row_number() over (order by priority) as rn 
        from namesTBL) tbl 
     WHERE rn > 1 
     ) tbl 
order by newPriority 

看到它在這裏工作:http://sqlfiddle.com/#!6/17cbb/3

編輯

還有一個更好的版本:

select id, name, priority 
    from (select id, name, priority, 
       ABS(CHECKSUM(NewId())) % 100 rnd, 
       row_number() over (order by priority) as rn 
      from namesTBL) tbl 
order by case when rn=1 then -1 else rnd end 

看到它在SQLFiddle上工作:http://sqlfiddle.com/#!6/8cc28/2

+0

這將工作,但他希望只有1行優先1是第一,這意味着其他優先級1應該是隨機的... – java

+0

@java現在我認爲這是正確的。 –