我有一个包含时间戳列、id列和电子邮件列的配置单元表,如下所示:
Insert_tm ID email
2020-04-01 02:03:05:857 1 xxx@mail.com
2020-04-01 02:03:05:879 2 xxx@mail.com
2020-04-01 03:05:08:678 3 xxy@mail.com
2020-04-01 03:05:09:789 4 xxy@mail.com
我试图计算的数字,唯一的id,共享相同的电子邮件地址之前(包括)每一行在一个小时内的基础上插入。我希望得到以下结果:
Insert_tm ID email Count
2020-04-01 02:03:05:857 1 xxx@mail.com 1
2020-04-01 02:03:05:879 2 xxx@mail.com 2
2020-04-01 03:05:08:678 3 xxy@mail.com 1
2020-04-01 03:05:09:789 4 xxy@mail.com 2
我的解决方案是使用如下配置单元窗口功能:
select insert_tm, id, email, count(id) over (partition by email order by insert_tm range between 3600 preceding and current row) as count
但我得到以下结果:
Insert_tm ID email Count
2020-04-01 02:03:05:857 1 xxx@mail.com 2
2020-04-01 02:03:05:879 2 xxx@mail.com 2
2020-04-01 03:05:08:678 3 xxy@mail.com 1
2020-04-01 03:05:09:789 4 xxy@mail.com 2
id=1的计数是2而不是1。当有另一条记录在1秒内有insert_tm差异时,就会发生这种情况。
即使在纳秒级,也有办法得到正确的计数吗?
1条答案
按热度按时间njthzxwz1#
这个答案有点猜测。
首先,时间戳可以通过两种不同的方式转换为数字:
到整数(秒)
浮点数(对于秒分数的unix历元)
配置单元中的窗框只接受一个数字。然而——这就是推测的地方——文档没有指定数字的类型。
我认为“数字”实际上是一个整数。这反过来会导致
timestamp
一个整数。作为整数,前两行具有相同的值——因此都被计数。我怀疑显式转换为浮点类型可以解决问题: