Sql server 如何找到两个连续日期之间的比率值

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

给出一个由以下内容组成的表格: 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-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分组会出错。