[讨论] 数据库大师请进

楼主: 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