iT邦幫忙

0

SQL特別的排序

esel 2012-11-21 11:51:193552 瀏覽
  • 分享至 

  • xImage

表:
Department Name
CC anniechao
AA maggie
GG sandy
EE yanghc
BB vicki
DD tinalee
AA cindy
BB monica
CC wendy
CC tiffany
………… …………

請問:
資料表大約有2萬筆資料,我要做SQL排序-每10筆一個循環,
每10筆內要包含2個AA、3個BB、1個CC 其他4個隨機放。

請問SQL語法有辦法做到嗎?

看更多先前的討論...收起先前的討論...
1.這不是排序
2.不知道這麼做的意義何在
落寞
summertw iT邦好手 1 級 ‧ 2012-11-22 09:47:37 檢舉
在人類發明及使用電腦的過程中,有發展出一種稱之為資料結構的理論..
資料結構有兩個大區塊,一是檔案系統,一是資料庫系統..
樓主可能只是在尋求一種問題的解決,看上去,它好像與所有資料結構無關...
但仔細想..
它有點像是檔案系統裡的資料結構的佇列(Queues)...(這只是的我的猜測啦,可能不會是樓主要的)
不管怎樣,它的排列方式皆不符合現行資料結構中所描述的索引要件...
因此,只能靠程式把它解決掉,無法用索引來排列它..
wiseguy iT邦超人 1 級 ‧ 2012-11-22 14:50:49 檢舉
應用實例:
1. 一個有兩萬員工的公司要尾牙辦桌。老闆說,各部門要混桌以培養感情,AA 事業群一桌要兩位,BB 事業群一桌要三位,CC 事業群一桌要一位,其它事業群補空隙。明天把桌號公布一下。

2. 一個有兩萬員工的公司要辦尾牙抽獎。老闆又說,BB 部門績效最好,抽獎率要達 3/10,AA 部門其次,抽獎率要達 2/10,CC 再次,抽獎率要達 1/10,其於就看著辦。所以分好組之後,先抽組,再抽號,就可以保證抽獎率了。
大師就是大師
不但解惑還替他想情境
拍手
如果是抽奬
我會準備四個箱子
裡面依部門不同分裝AA, BB, CC 和其他
每抽10次奬
就從AA裡抽兩張
從BB裡抽三張
從CC裡抽一張
從其他裡抽四張
這樣應該比較有抽奬的feel
泡湯

話又說回來
公司裡的AA,BB,CC的員工數
也許不會那麼剛好是2:3:1
疑惑
ted99tw iT邦高手 1 級 ‧ 2012-11-22 18:17:58 檢舉

好傳神的use case...


要我被蟲蟲佔據的頭腦是一定擠不出來滴~~~臉紅
好深奧~~不愧是大師!!
magician iT邦研究生 2 級 ‧ 2012-11-23 00:53:15 檢舉
簽名簽名拍照
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

12
wiseguy
iT邦超人 1 級 ‧ 2012-11-21 13:45:06
最佳解答

每 10 人是一個分組,假設你的組別從 0 開始第一組,一直到第 N 組。
先把你的資料表新增一個欄位 group_id 是 int unsigned。

  1. CC 每組一位,所以把 CC 分組:
    update TABLE set group_id=ROW_NUMBER()-1 where Department='CC';
  2. AA 每組兩位,所以把 AA 分組:
    update TABLE set group_id=(ROW_NUMBER()-1)/2 where Department='AA';
  3. BB 每組三位,所以把 BB 分組:
    update TABLE set group_id=(ROW_NUMBER()-1)/3 where Department='BB';
  4. 最後四個就亂排
    update TABLE set group_id=(ROW_NUMBER()-1)/4 where group_id is null order by newid();

就這樣。group_id 是 0 的就是第一組,1 的就是第二組,依此類推。

summertw iT邦好手 1 級 ‧ 2012-11-21 14:07:34 檢舉

Row_Number() 好像不能這樣用...
我印像中的 Row_Number() 它要配合 Over() 使用...
ROW_NUMBER( ) OVER([<partition_by_clause>]<order_by_clause>)

wiseguy iT邦超人 1 級 ‧ 2012-11-22 00:07:26 檢舉

我用 Row_Number() 只是想表達這個值是 recordset 的順序。
也許 Row_Number() 真的不能這樣用,但是這樣的做法是可以達到需求的。
所以依此方法寫出 Stored procedure 或程式就可以做到了。

8
summertw
iT邦好手 1 級 ‧ 2012-11-21 13:44:36

這東西應該是在規劃時,資料結構應該要先行作業工作..
若已是即有的資料,SQL排序(索引)應是無法做到,只能用分類的方式來完成它吧..

我要發表回答

立即登入回答