close

直接上 sql script (適用於 ms sql server)

sql script
           WITH MyRowSet
            AS
            (
             select *,ROW_NUMBER() OVER (PARTITION BY ac.owner_id ORDER BY ac.owner_id asc) AS RowNum from
             (SELECT top 99 percent c.createdTime,c.owner_id,NEWID() as new_id
             FROM [dbo].[at_Chat] c
             ORDER by new_id
             ) as ac
             )
 
             SELECT * FROM MyRowSet WHERE RowNum <= 5

 


我不是SQL高手,但仍強行解釋一波(只講我懂大概的部分 QQ),希望對看官有一點幫助
 
首先段SQL 有 WITH XXX AS ( ... ),很明顯屬於子查詢的一種表達方式(CTE)
(關於 子查詢CTE可以參考這篇的上半部分 : http://daidos200211.blogspot.com/2012/05/sql-with.html)
 
雖然我不太懂內部運作原理(好像有優化過 CTE 這種寫法的效能),
但操作上我是直接把CTE理解為,類似view的概念,
在執行本段SQL的時候,他會先把 製作出一個資料表(MyRowSet),然後要使用的時候,直接抓過來用
 
接著說說 CTE 中有用到,比較不常見的 SQL 部分
ROW_NUMBER() OVER (PARTITION BY ...) -> 可以依照指定欄位分組然後在每一筆資料後面加上排序的數字(1,2,3...)
詳情可以參考
https://dotblogs.com.tw/topcat/2009/08/06/9906
https://docs.microsoft.com/zh-tw/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017
 
NEWID() as new_id ...ORDER by new_id -> 把查詢出來的結果,多一個欄位然後塞進一個唯一值,
再依照這個欄位排序,取得前 10 個值,就達成隨機取得10筆資料的效果
 
最後,這個子查詢的結果就會是已經是依照 ower_id 分群 & 同一群裡有加上編號 & 隨機排序 的資料
再取每一群的前10筆,就達成 "把資料 group ,然後取出每一個群組裡面的隨機 10 個" 的效果了
 

實際操作


arrow
arrow

    sonyvsshadow 發表在 痞客邦 留言(0) 人氣()