【问题标题】:Complex SQL aggregation复杂的 SQL 聚合
【发布时间】:2012-06-09 14:12:39
【问题描述】:

我有一个类似这样的数据集:

X | U | datetime
-------------
1 | 1 | 1/1/12
1 | 2 | 1/1/12
1 | 2 | 1/1/12
1 | 2 | 1/1/12
1 | 4 | 1/1/12
2 | 2 | 2/1/12
2 | 3 | 2/1/12
1 | 3 | 3/1/12
2 | 4 | 3/1/12
3 | 2 | 4/1/12

这是访问日志。 X是访问的东西的id,U是用户id

我需要计算两个统计数据。

给定 X (x) 的值:

1) “新访问者”:统计第一次访问任意 X 到 x 的唯一用户数。

用例:

  • 一个用户只访问过x一次 -> 计为 1
  • 一个用户只访问过!x一次 -> 计为 0
  • 一个用户只访问了两次x -> 计为 1
  • 一个用户只访问了两次!x -> 计为 0
  • 一个用户访问了很多个X,他们对任何X的第一次访问是x -> 计为1
  • 一个用户访问了很多个X,他们对任何X的第一次访问是!x -> 计为0

以上数据示例:

X | Count
---------
1 | 3
2 | 1
3 | 0

2) “回访者”:计算访问过x 一次以上或访问过x 一次但之前访问过另一个X 的唯一用户数(即在他们单次访问@987654334 后进行的访问) @不算)

以上数据示例:

X | Count
---------
1 | 3
2 | 2
3 | 1 

我正在使用 SQL Server 2008,非常感谢任何帮助。谢谢!

更新

这似乎回答了 Q1,虽然它不是很快:(

select x.X, COUNT(1)
from (
    select t1.X
    from @t t1
    group by t1.X, t1.U
    having (select COUNT (1) from @t t2 where t2.u= t1.U and t2.OccurredOn < MIN(t1.OccurredOn)) =0 
) x 
group by x.X

更新 2

认为这是(2)

select t.X, COUNT(1)
from @t t
left join (
    select t.U, MIN(t.OccurredOn) as O
    from @t t
    group by t.U
) x on t.U = x.U and t.OccurredOn <= x.O
where x.U is null
group by t.X

【问题讨论】:

    标签: tsql aggregation


    【解决方案1】:

    对于第一种情况,您需要加入一个子查询,该子查询将过滤掉所有非首创的用户访问。所以你会有类似的东西

    select X, count(*) [First Visits]
    from table t1
         join (select U, min(datetime) firstvisit 
               from table 
               group by U) t2 on t1.datetime = t2.firstvisit and t1.U = t2.U
    group by X
    

    编辑:我认为您对第二个解决方案的解决方案很好,只是如果您将&lt;= 替换为简单的=,则连接会更快。

    【讨论】:

    • 对不起,我不小心忘记了第一个连接的其他部分。应该工作。
    • 是的,我发现并添加了它们,但仍然不对。它不排除以前访问过不同 X 的用户
    • 啊,我知道我被你的例子弄糊涂了。您的简短描述和较长的“用例”描述似乎不一致。 “新用户”的总和怎么会大于这些用户的不同数量?
    • 我对#1 的更新提供了与您的更新相同的输出。这些都没有给出与您的示例答案相同的结果...
    • 嗯,什么让您感到困惑?对我来说没问题,这是什么错误,不想让我们中的任何一个人感到困惑 :) 是的,你的 (1) 确实同意我的观点,而且速度要快得多。现在进入(2)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2019-03-14
    • 2018-10-31
    相关资源
    最近更新 更多