当前位置: 首页 > 面试题库 >

查询滚动日期范围内不同值的计数

徐新荣
2023-03-14
问题内容

我有一组电子邮件地址和将这些电子邮件地址添加到表中的日期的数据集。电子邮件地址在不同的日期可以有多个条目。例如,如果我有下面的数据集。我希望获得上述日期和3天前之间不同电子邮件的日期和计数。

Date   | email  
-------+----------------
1/1/12 | test@test.com
1/1/12 | test1@test.com
1/1/12 | test2@test.com
1/2/12 | test1@test.com
1/2/12 | test2@test.com
1/3/12 | test@test.com
1/4/12 | test@test.com
1/5/12 | test@test.com
1/5/12 | test@test.com
1/6/12 | test@test.com
1/6/12 | test@test.com
1/6/12 | test1@test.com

如果我们使用3的日期周期,结果集将看起来像这样

date   | count(distinct email)
-------+------
1/1/12 | 3
1/2/12 | 3
1/3/12 | 3
1/4/12 | 3
1/5/12 | 2
1/6/12 | 2

我可以使用下面的查询来获得日期范围的不同计数,但希望按天获得一个范围的计数,因此我不必手动更新数百个日期的范围。

select test.date, count(distinct test.email)  
from test_table as test  
where test.date between '2012-01-01' and '2012-05-08'  
group by test.date;

感谢您的帮助。


问题答案:

测试用例:

CREATE TEMP TABLE tbl (day date, email text);
INSERT INTO tbl VALUES
 ('2012-01-01', 'test@test.com')
,('2012-01-01', 'test1@test.com')
,('2012-01-01', 'test2@test.com')
,('2012-01-02', 'test1@test.com')
,('2012-01-02', 'test2@test.com')
,('2012-01-03', 'test@test.com')
,('2012-01-04', 'test@test.com')
,('2012-01-05', 'test@test.com')
,('2012-01-05', 'test@test.com')
,('2012-01-06', 'test@test.com')
,('2012-01-06', 'test@test.com')
,('2012-01-06', 'test1@test.com`');

查询-仅返回条目中存在的天数tbl:

SELECT day
     ,(SELECT count(DISTINCT email)
       FROM   tbl
       WHERE  day BETWEEN t.day - 2 AND t.day -- period of 3 days
      ) AS dist_emails
FROM   tbl t
WHERE  day BETWEEN '2012-01-01' AND '2012-01-06'  
GROUP  BY 1
ORDER  BY 1;

或者-返回指定范围内的所有日期,即使当天没有行:

SELECT day
     ,(SELECT count(DISTINCT email)
       FROM   tbl
       WHERE  day BETWEEN g.day - 2 AND g.day
      ) AS dist_emails
FROM  (SELECT generate_series('2012-01-01'::date
                            , '2012-01-06'::date, '1d')::date) AS g(day)

结果:

day        | dist_emails
-----------+------------
2012-01-01 | 3
2012-01-02 | 3
2012-01-03 | 3
2012-01-04 | 3
2012-01-05 | 1
2012-01-06 | 2

起初,这听起来像是完成窗口功能的工作,但是我没有找到定义合适的窗口框架的方法。另外,根据文档:

与普通的聚合函数不同,聚合窗口函数不允许DISTINCT或ORDER BY不能在函数参数列表中使用。

因此,我改为使用相关子查询来解决它。我想那是最聪明的方法。

我将您的日期列重命名为day,因为使用类型名称作为标识符是一种不好的做法。

顺便说一句,“在所述日期和3天前之间”将是4天。您的定义在那里是矛盾的。

短一点,但仅几天就变慢了:

SELECT day, count(DISTINCT email) AS dist_emails
FROM  (SELECT generate_series('2013-01-01'::date
                            , '2013-01-06'::date, '1d')::date) AS g(day)
LEFT   JOIN tbl t ON t.day BETWEEN g.day - 2 AND g.day
GROUP  BY 1
ORDER  BY 1;


 类似资料:
  • 问题内容: 这个问题已经有了SQL的答案,并且我能够使用R在R中实现该解决方案。但是,我一直找不到使用来实现它的方法。 问题是要计算滚动日期范围内一列的不同值,例如(如果直接从链接的问题中引用)数据是否如下所示: 如果我们使用3天的日期范围,则结果集将类似于以下内容 这是使用R在R中创建相同数据的代码: 在这方面的任何帮助将不胜感激。谢谢! 编辑1: 这是一个玩具问题,我想将其应用于更大的数据集,

  • 我的文档中有一个日期范围(使用日期对象)如下所示 我试图弄清楚如何构建一个查询来返回包含特定日期的所有事件,例如,像.... 如果查询显示类似这样的内容,但在Firestore查询限制下可能不可能出现这种情况。 因此,我一直在挠头几个小时,要么为此构建一个查询,要么以某种方式结构我的数据,以允许这样做。 这有可能吗?

  • 我需要帮助查询与日期范围的长收集。请参阅下面的示例文档。我想用日期范围查询startTime字段。

  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 我有一个大约为100GB的cosmos数据库。我成功地创建了一个漂亮的分区键,我在70M记录上有大约4600个分区,但是我仍然需要查询两个存储为字符串的日期时间字段,而不是纪元格式。 示例json: 我注意到当我做中选择*以及当我做

  • 这是当我尝试使用'where'而不是'where field'时收到的错误,尽管从文档中看,'where'似乎是查询Firestore数据库的有效命令。是不是我需要下载其他的豆荚?我有的是:pod'firebase/analytics'pod'firebase/auth'pod'firebase/core'pod'firebase/firestore'