栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

测试用例:

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_emailsFROM   tbl tWHERe  day BETWEEN '2012-01-01' AND '2012-01-06'  GROUP  BY 1ORDER  BY 1;

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

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

结果:

day        | dist_emails-----------+------------2012-01-01 | 32012-01-02 | 32012-01-03 | 32012-01-04 | 32012-01-05 | 12012-01-06 | 2

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

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

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

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

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

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

SELECT day, count(DISTINCT email) AS dist_emailsFROM  (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.dayGROUP  BY 1ORDER  BY 1;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/418704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号