[SQL ] 以亂數排序的一種方式

看板Database作者 (還在想)時間8年前 (2016/04/01 16:56), 8年前編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
資料庫名稱:MS SQL Server 資料庫版本:2008 R2 內容/問題描述: 純粹分享 假設A表是商品資料,B表是訂單,然後要Join後,亂數排序。並且排序依據是A表商品資料 取亂數順序,再用B表訂單資料取亂數順序,兩個亂數不互相影響,呈現的結果舉例如下: 商品C 訂單3 商品C 訂單1 商品C 訂單2 商品A 訂單2 商品A 訂單1 商品B 訂單2 .... 商品雖然亂數排列,但是所有同樣的商品都要排在一起,然後才排訂單 綜合查詢Google後,這是我的寫法 Select * From ( Select 商品編號, 品名 , Rank() Over (Order By Abs(CheckSum(NewId())) % 10000) As RndA From A ) VA Inner Join ( Select 訂單編號, 商品編號, 訂單 , Rank() Over (Order By Abs(CheckSum(NewId())) % 10000) As RndB From B ) VB On VB.商品編號 = VA.商品編號 Order By RndA, RndB 其實原本只想寫到Abs以及它包住的部分就好,但NewId函數似乎會延後到子查詢完成之後 才繼續執行,導致明明是同樣的商品,RndA的數字卻不一樣結果商品沒辦法排在一起。 突發奇想用Rank函數產生的結果是不是就不會受影響了,還好結果證實是可以的,Rand() 或NewId()和我想像的動作不同真是繞了好大圈,為什麼要弄Rand()這種假亂數呢... 或許有更好的寫法? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.18.8 ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1459500976.A.D44.html ※ 編輯: Peruheru (220.134.18.8), 04/01/2016 17:04:27

04/05 21:00, , 1F
我都偷懶直接order by newid()
04/05 21:00, 1F

04/20 17:28, , 2F
如果不是因為發現NewId()結果不如預期我也不想XD
04/20 17:28, 2F
文章代碼(AID): #1M_ZUmr4 (Database)