我有一张这样的表:
Id, ReportId, UserId
1 1 1
2 2 1
3 3 1
4 4 1
5 1 2
6 2 2
7 3 2
8 1 3
9 2 3
10 1 4
我的表有数以千计的记录,上面只是为简化问题而简化的表结构示例。
我正在尝试根据用户阅读的报告数量确定用户所处的百分位数。
我一直在研究PERCENTILE_CONT和PERCENTILE_DISC函数,但我无法正确理解它们。 https://docs.microsoft.com/en-us/sql/t-sql/functions/percentile-cont-transact-sql
最让我困惑的是,在我看来,这些功能正试图找到第50个百分位数,而不是特定记录的百分位数。
也许我只是没有正确理解这一点。还有更好的方法吗?
编辑:
澄清。我想知道特定用户(在这种情况下,id为1的用户)的百分位数取决于他们阅读了多少报告。如果他们阅读的报告最多,那么他们的百分位数就会更高,这个百分位数是多少?假设确切地说有100个用户,那么阅读大多数报告的人将是第1百分位数。
答案 0 :(得分:2)
其中一个应该这样做:
select
a.UserId,
a.reports_read,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY a.reports_read) OVER (partition by UserId) AS percentile_d,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY a.reports_read) OVER (partition by UserId) AS percentile_c,
PERCENT_RANK() OVER(ORDER BY a.reports_read ) percent_rank,
CUME_DIST() OVER(ORDER BY a.reports_read ) AS cumulative_distance
from
(select UserId, count(distinct(ReportId)) as reports_read
from #tmp
group by UserId
) a
它给出了以下结果:
UserId reports_read percentile_d percentile_c percent_rank cumulative_distance
4 1 1 1 0 0.25
3 2 2 2 0.33333 0.5
2 3 3 3 0.66667 0.75
1 6 6 6 1 1
我希望这会有所帮助。