Sql server 如何找到两个连续日期之间的比率值
给出一个由以下内容组成的表格: ID\u用户,日期 我想找出连续两天之间的比率, 参加第x天和第x+1天的相同人群之间的比率。 我举个例子: 比如说:Sql server 如何找到两个连续日期之间的比率值,sql-server,date,group-by,aggregate-functions,Sql Server,Date,Group By,Aggregate Functions,给出一个由以下内容组成的表格: ID\u用户,日期 我想找出连续两天之间的比率, 参加第x天和第x+1天的相同人群之间的比率。 我举个例子: 比如说: Bill 12155 2018-05-01 Jim 52135 2018-05-01 Homer 52135 2018-05-01 Jecki 56135 2018-05-01 Michael 45644 2018-05-02 Jim 52135 2018-05-02 Jessy 45645 2018-05-02 Homer 52135 2018
Bill 12155 2018-05-01
Jim 52135 2018-05-01
Homer 52135 2018-05-01
Jecki 56135 2018-05-01
Michael 45644 2018-05-02
Jim 52135 2018-05-02
Jessy 45645 2018-05-02
Homer 52135 2018-05-02
所以这个比率是2/4=0.5
最后一天,我试图自己解决这个问题,但遇到了一些困难。
我从按日期分组开始:
Select Date, ID_USER
GROUP BY DATE, ID_USER
ORDER BY DATE, ID_USER
谁能给我点建议吗
谢谢大家! 试试这个:
SELECT t1.[Date],
( CONVERT(decimal, SUM(CASE WHEN t2.[ID] IS NOT NULL THEN 1 ELSE 0 END) ) / COUNT(t1.[ID]) ) AS [Ratio]
FROM @YourTbl t1
LEFT OUTER JOIN @YourTbl t2 ON t2.[ID] = t1.[ID] AND t2.[Date] = DATEADD(DAY, 1, t1.[Date])
GROUP BY t1.[Date]
按第一个日期对数据进行分组(在您的样本中,05-01-2018
)
然后,通过执行左外部联接来自联接表,这样您就有了完整的数据列表和第二个数据列表,其中第二天相同的用户(基于ID)再次出现在数据中(DATEADD(day,1,…)
)
然后,您可以通过将t2
中的任何字段检查为NULL
来判断是否有用户根据给定日期连续参加了两天
要获得参加t1.[Date]
和下一个日期t2.[Date]
的用户比率,将t2
中ID
为非空的用户总数除以t1
中当天的用户总数。现在,由于在这种情况下SUM
返回一个INT
,您需要一个小数,将SUM
转换为decimal
,您将得到一个小数
以下是示例数据的结果:注意:更改Jim或Homer的ID后,因为他们最初具有相同的ID
Date Ratio
2018-05-01 0.50000000000
2018-05-02 0.00000000000
自联接解决方案是有效的。您也可以尝试这种方法:
with data as (
select "date",
case when dateadd(day, 1, "date") =
lead("date") over (partition by id order by "date")
then 1 end as returned
from T
)
select "date", count(returned) * 1. / count(*) as ratio
from data
group by "date";
如果您想消除最终日期,因为它始终为零,那么可以很容易地添加case,当“date”max(“date”)超过()时,则1结束为notfinal
,并根据该值进行过滤
在2/4=0.5
中2
和4
是什么?谢谢。您的样本数据有问题。。。2个用户(Jim和Homer)都有相同的ID(52135),因此按ID分组会出错。