根据以前的组计算唯一条目
Count unique entries based on previous groups
试图在每个组中找到唯一值,但要回顾一下之前分组的项目。它将按时间分组,因此如果前一个时间块具有唯一值,则它不应出现在下一个时间块中。回顾应该跨越所有以前的时间块。所以在时间 2,它查看时间 0 和 1,而在时间 10,它查看时间 0 到 9。
我也希望动态地执行此操作,而无需使用子查询手动偏移每个时间块,因为这里的时间是连续的而不是离散的数据集。
示例数据:
2018-03-25 00:00:00.000, 123
2018-03-25 00:00:00.000, 231
2018-03-26 00:00:00.000, 234
2018-03-26 00:00:00.000, 123
2018-03-27 00:00:00.000, 123
2018-03-27 00:00:00.000, 231
2018-03-27 00:00:00.000, 234
2018-03-27 00:00:00.000, 432
示例输出:
2018-03-25 00:00:00.000, 2
2018-03-26 00:00:00.000, 1
2018-03-27 00:00:00.000, 1
如果我没看错,你可以考虑,如果这个值存在于任何过去的组中,就应该将其排除在结果集中。
我觉得这种方法应该对你有帮助:
select groupped.t, count(*) from
(select distinct base.t, base.v from foo as base where v not in
(
select u.v from foo as u where u.t < base.t
)
) as groupped group by groupped.t;
这里还有一个fiddle。希望这可以帮助。 http://sqlfiddle.com/#!18/4a65e/1
试图在每个组中找到唯一值,但要回顾一下之前分组的项目。它将按时间分组,因此如果前一个时间块具有唯一值,则它不应出现在下一个时间块中。回顾应该跨越所有以前的时间块。所以在时间 2,它查看时间 0 和 1,而在时间 10,它查看时间 0 到 9。
我也希望动态地执行此操作,而无需使用子查询手动偏移每个时间块,因为这里的时间是连续的而不是离散的数据集。
示例数据:
2018-03-25 00:00:00.000, 123
2018-03-25 00:00:00.000, 231
2018-03-26 00:00:00.000, 234
2018-03-26 00:00:00.000, 123
2018-03-27 00:00:00.000, 123
2018-03-27 00:00:00.000, 231
2018-03-27 00:00:00.000, 234
2018-03-27 00:00:00.000, 432
示例输出:
2018-03-25 00:00:00.000, 2
2018-03-26 00:00:00.000, 1
2018-03-27 00:00:00.000, 1
如果我没看错,你可以考虑,如果这个值存在于任何过去的组中,就应该将其排除在结果集中。
我觉得这种方法应该对你有帮助:
select groupped.t, count(*) from
(select distinct base.t, base.v from foo as base where v not in
(
select u.v from foo as u where u.t < base.t
)
) as groupped group by groupped.t;
这里还有一个fiddle。希望这可以帮助。 http://sqlfiddle.com/#!18/4a65e/1