[討論] 資料庫大師請進

作者: an94mod0 (an94mod0)   2023-12-28 13:29:39
情境是有100萬隻VT豚跟50個水管頻道
V豚每天會看好幾次直播,每次可能看同個頻道,也可能看不同頻道
每當VT豚點開水管頻道看台,在資料庫紀錄VT豚、頻道名、時間、跟一些其他東西
(索引建在VT豚)
原本的需求是指定任一隻V豚,回傳他最近一次看的頻道
做法很單純
SELECT TOP(1) 頻道 FROM [看台紀錄] WHERE VT豚 = 'laptic' ORDER BY 時間 DESC
現在查詢需求改成要回傳他最近看過的3個相異頻道
姆咪的想法是用窗函數先排出每個頻道的最後一次觀看時間,再去排序取最新3個
WITH T AS (
SELECT 頻道,時間,
ROW_NUMBER() OVER (PARTITION BY VT豚, 頻道 ORDER BY 時間 DESC) AS R
FROM [看台紀錄] WHERE VT豚 = 'laptic'
) SELECT TOP(3) 頻道 FROM T WHERE R = 1 ORDER BY 時間 DESC
看起來結果是對的,但怕調整後影響到效能
有什麼效率更好的方法嗎?
作者: walter741225 (瓦特)   2023-12-28 13:31:00
直接排時間 從頭抓直到抓到第三個不同就你原本的作法是只抓第一筆改成一直 抓 重複的丟掉 不同的紀錄紀錄到第三個不同的就跳出
作者: koy784512 (我永遠喜歡風真いろは)   2023-12-28 13:32:00
為什麼不用DISTINCT直接前抓三個等一下 DISTINCT好像不行 時間都不一樣==
作者: ILoveNTR (愛綠綠)   2023-12-28 13:55:00
抓出來會亂484時間格式的關係 之前有遇過類似問題另外拉一行重新定義時間再用那行排序 雖然蠻蠢的
作者: walter741225 (瓦特)   2023-12-28 14:07:00
我c語言派的會想這樣做

Links booklink

Contact Us: admin [ a t ] ucptt.com