给出一个包含以下内容的表: 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
有人可以给我一些提示吗
谢谢大家!
答案 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]
的用户的比率,请汇总t2
中ID
为NOT NULL
且将其除以t1
中当天的用户总数。现在,由于在这种情况下SUM
返回一个INT
并且您需要一个小数,因此CONVERT
从SUM
到DECIMAL
,您将得到一个十进制数。
以下是示例数据的结果:注意:更改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
并根据该日期进行过滤。