sql – 从每个组中选择前1行
发布时间:2020-12-12 08:52:53 所属栏目:MsSql教程 来源:网络整理
导读:我有一个表格列出了安装的软件版本: id | userid | version | datetime----+--------+---------+------------------------111 | 75 | 10075 | 2013-03-12 13:40:58.770112 | 75 | 10079 | 2013-03-12 13:41:01.583113 | 78 | 10065 | 2013-03-12 14:18:24.46
我有一个表格列出了安装的软件版本:
id | userid | version | datetime ----+--------+---------+------------------------ 111 | 75 | 10075 | 2013-03-12 13:40:58.770 112 | 75 | 10079 | 2013-03-12 13:41:01.583 113 | 78 | 10065 | 2013-03-12 14:18:24.463 114 | 78 | 10079 | 2013-03-12 14:22:20.437 115 | 78 | 10079 | 2013-03-12 14:24:01.830 116 | 78 | 10080 | 2013-03-12 14:24:06.893 117 | 74 | 10080 | 2013-03-12 15:31:42.797 118 | 75 | 10079 | 2013-03-13 07:03:56.157 119 | 75 | 10080 | 2013-03-13 07:05:23.137 120 | 65 | 10080 | 2013-03-13 07:24:33.323 121 | 68 | 10080 | 2013-03-13 08:03:24.247 122 | 71 | 10080 | 2013-03-13 08:20:16.173 123 | 78 | 10080 | 2013-03-13 08:28:25.487 124 | 56 | 10080 | 2013-03-13 08:49:44.503 我想显示每个用户名的一个记录的所有字段,但只显示最高版本(也是版本是varchar). 解决方法你没有指定你想要如何处理关系,但是如果你想要重复的显示;SELECT a.* FROM MyTable a LEFT JOIN MyTable b ON a.userid=b.userid AND CAST(a.version AS INT) < CAST(b.version AS INT) WHERE b.version IS NULL An SQLfiddle to test with. 如果你想删除重复的东西,如果他们存在选择最新的,你必须稍微扩展查询; WITH cte AS (SELECT *,CAST(version AS INT) num_version FROM MyTable) SELECT a.id,a.userid,a.version,a.datetime FROM cte a LEFT JOIN cte b ON a.userid=b.userid AND (a.num_version < b.num_version OR (a.num_version = b.num_version AND a.[datetime]<b.[datetime])) WHERE b.version IS NULL Another SQLfiddle. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |