背景
> id – varchar(50)
> g1 – varchar(50)
> g2 – varchar(50)
> datetime – 时间戳
我有这个问题:
SELECT g1,COUNT(disTINCT id),SUM(COUNT(disTINCT id)) OVER () AS total,(CAST(COUNT(disTINCT id) AS float) / SUM(COUNT(disTINCT id)) OVER ()) AS share FROM my_table and g2 = 'start' GROUP BY 1 order by share desc
问题
每个id可能在表中有多个记录.我想考虑最早的一个.早期意味着,最小日期时间值.
例
表
id g1 g2 datetime x1 a start 2016-01-19 21:01:22 x1 c start 2016-01-19 21:01:21 x2 b start 2016-01-19 09:03:42 x1 a start 2016-01-18 13:56:45
实际查询结果
g1 count total share a 2 4 0.5 b 1 4 0.25 c 1 4 0.25
我们有4条记录,但我只想考虑两条记录:
x2 b start 2016-01-19 09:03:42 x1 a start 2016-01-18 13:56:45
这是每个id最早的记录.
预期的查询结果
g1 count total share a 1 2 0.5 b 1 2 0.5
题
我如何仅考虑组中每个id的最早记录
解决方法
您正在查询my_table的所有数据,尽管您只想拥有最早的id日期.我假设id是表中的主键.
我建议您定义一个视图(或内联视图),它只查询id的最早日期,并在该视图上使用您的查询而不是my_table.
视图可以定义为如此,并且只包含最早日期的id:
select * from my_table a where a.datetime = (select min(z.datetime) from my_table z where a.id = z.id) and a.g2 = 'start'
您可以将其定义为视图或直接使用它,如下所示:
SELECT g1,(CAST(COUNT(disTINCT id) AS float) / SUM(COUNT(disTINCT id)) OVER ()) AS share FROM (select a.id,a.g1,a.g2,a.datetime from my_table a where a.datetime = (select min(z.datetime) from my_table z where a.id = z.id) and a.g2 = 'start') GROUP BY 1 order by share desc
原文地址:https://www.jb51.cc/mssql/74708.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。