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

时间:2019-08-28 13:53:41

标签: sql-server date group-by aggregate-functions

给出一个包含以下内容的表: ID_User,日期

我想找到每两天的比例, 参加第x天和第x + 1天的同一个人之间的比率。 我举个例子:

让我们说:

for i in *.md; do 
   SetFile -d $(sed 's/[^0-9]//g;s/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\).*/\1\/\2\/\3 00:00:00/' <<< "$i") "$i"
done

所以比率将是2/4 = 0.5

在最后一天,我尝试自己解决该问题,但遇到了一些困难。 我先按日期分组:

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 个答案:

答案 0 :(得分:1)

尝试一下:

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]

按第一个Date(在示例中,05-01-2018)对数据进行分组。

然后,通过执行LEFT OUTER JOIN自联接表,以便获得完整的数据列表和仅包含同一用户(基于ID)的数据的第二个列表, (DATEADD( DAY, 1, ... ))。

然后,您可以通过将t2中的任何字段选中为NULL来确定是否有用户根据给定的日期连续参加了两天。

要获得参加t1.[Date]和下一个约会t2.[Date]的用户的比率,请汇总t2IDNOT NULL且将其除以t1中当天的用户总数。现在,由于在这种情况下SUM返回一个INT并且您需要一个小数,因此CONVERTSUMDECIMAL,您将得到一个十进制数。

以下是示例数据的结果:注意:更改Jim或Homer的ID后,因为它们最初具有相同的ID。

Date          Ratio
2018-05-01    0.50000000000
2018-05-02    0.00000000000

答案 1 :(得分:1)

自联接解决方案有效。您也可以尝试这种方法:

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 when "date" <> max("date") over () then 1 end as notfinal并根据该日期进行过滤。

https://rextester.com/HHL82126