SQL:查找具有给定日期范围内每月数据的记录

亚历克斯

考虑下表

 =# \d users
 Column |         Type
--------+-----------------------
 id     | integer
 name   | character varying(32)

=# \d profiles
 Column  |  Type
---------+---------
 id      | integer
 user_id | integer

=# \d views
   Column   |            Type
------------+-----------------------------
 id         | integer
 profile_id | integer
 time       | timestamp without time zone

我需要在给定日期范围的每个月中找到所有具有关联视图的用户。目前,我正在执行以下操作:

with months as (
  select to_char(month, 'MM/YYYY') from generate_series('2014-07-01', '2014-09-01', INTERVAL '1 month') as month
)

select * from users
  join profiles on user_id = users.id
  join views on profile_id = profiles.id
    and to_char(views.time, 'MM/YYYY') in (select * from months)

在这里一个小提琴

当前结果包括用户Kyle,他在8月和9月没有观看次数。正确的结果应仅包括在给定范围内的所有3个月内均拥有视图的用户Stan我们如何修改此查询以返回所需结果?

维戈罗夫

您似乎具有扩展的关系划分,即,您正在寻找仅具有给定范围内的视图的用户,尽管他们也可能具有不在感兴趣范围内的视图。

与一起GROUP BY,您可以通过EXCEPT构造检查此内容基本上,如果您将范围内的所有月份减去给定范围内的所有视图,那么您应该不会收到任何行:

WITH months(month) AS (
  SELECT DATE '2014-07-01' + m*INTERVAL'1mon'
    FROM generate_series(0,2) m
)
SELECT *
  FROM users    u
  JOIN profiles p ON p.user_id=u.id
  JOIN views    v ON v.profile_id=p.id
 WHERE 0 = (SELECT count(*) FROM (
    SELECT month FROM months
    EXCEPT ALL
    SELECT date_trunc('mon',time) FROM views
     WHERE date_trunc('mon',time) IN (SELECT * FROM months)
       AND profile_id=p.id) minus);

您可以通过= ALL构造略微简化此构造,因为true在子查询不返回任何行的情况下它将返回

WITH months(month) AS (
  SELECT DATE '2014-07-01' + m*INTERVAL'1mon'
    FROM generate_series(0,2) m
)
SELECT *
  FROM users    u
  JOIN profiles p ON p.user_id=u.id
  JOIN views    v ON v.profile_id=p.id
 WHERE date_trunc('mon',time) = ALL (
    SELECT month FROM months
    EXCEPT ALL
    SELECT date_trunc('mon',time) FROM views
     WHERE date_trunc('mon',time) IN (SELECT * FROM months)
       AND profile_id=p.id);

手册引用ALL

如果所有行都为true (包括子查询不返回任何行的情况),则ALL的结果为“ true”

我的两个查询实际上是相同的。第一个计算内侧的行数,并将它们与零进行比较(我同意,这一点更加明显)。第二个将当前views.time与子查询的所有结果进行比较仅当子查询返回的所有条目都等于views.time(当然,被截断为月份边界)时,此构造才产生true 并且,如所引用的,如果子查询不返回任何行,则此构造也会产生true。

并且出于意图,子查询不应产生任何行,这表明所有视图都在所需的时间范围内发生。

Check on SQL Fiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL:查找具有给定日期范围内每个月的数据的记录

来自分类Dev

PL / SQL函数可计算给定日期范围内的平均每月

来自分类Dev

SQL Server-查找给定日期范围内的活跃客户

来自分类Dev

给定日期范围,查找在该范围内重叠的事件

来自分类Dev

如何查找在给定日期范围内创建的对象?

来自分类Dev

如何获得给定日期范围内的天数

来自分类Dev

给定日期范围内当前周的天数

来自分类Dev

在JavaScript中获取给定日期范围内的所有日期的列表

来自分类Dev

将给定日期范围内的所有日期存储到变量中

来自分类Dev

SQL:在给定日期范围内重复模式

来自分类Dev

获取给定日期范围内的月份的开始日期和结束日期

来自分类Dev

SQL查询,用于查找某个日期范围内某个特定日期存在的所有记录

来自分类Dev

从数据库中检索给定日期范围内的可用房间及其床

来自分类Dev

给定日期时间范围内的随机日期时间

来自分类Dev

给定日期时间范围内的随机日期时间

来自分类Dev

给定日期范围内的第一个非空值

来自分类Dev

在给定日期范围内查询BigQuery表

来自分类Dev

MySQL-获取给定日期范围内的并发事件总数

来自分类Dev

给定日期范围内活动用户的每日计数

来自分类Dev

给定日期数组,将结果显示在“周”范围内

来自分类Dev

熊猫-比较给定日期范围内小时平均值的平均值

来自分类Dev

在给定日期范围内每天计数设备

来自分类Dev

在给定日期范围内选择可用的客房

来自分类Dev

Couchbase在给定日期范围内获取文档

来自分类Dev

在特定日期范围内查找具有特定文本的文件

来自分类Dev

T-SQL在给定日期范围内在同一天从同一客户查找多个订单

来自分类Dev

T-SQL在给定日期范围内在同一天从同一客户查找多个订单

来自分类Dev

SQL从给定日期选择前3条记录

来自分类Dev

SQL从给定日期选择前3条记录

Related 相关文章

  1. 1

    SQL:查找具有给定日期范围内每个月的数据的记录

  2. 2

    PL / SQL函数可计算给定日期范围内的平均每月

  3. 3

    SQL Server-查找给定日期范围内的活跃客户

  4. 4

    给定日期范围,查找在该范围内重叠的事件

  5. 5

    如何查找在给定日期范围内创建的对象?

  6. 6

    如何获得给定日期范围内的天数

  7. 7

    给定日期范围内当前周的天数

  8. 8

    在JavaScript中获取给定日期范围内的所有日期的列表

  9. 9

    将给定日期范围内的所有日期存储到变量中

  10. 10

    SQL:在给定日期范围内重复模式

  11. 11

    获取给定日期范围内的月份的开始日期和结束日期

  12. 12

    SQL查询,用于查找某个日期范围内某个特定日期存在的所有记录

  13. 13

    从数据库中检索给定日期范围内的可用房间及其床

  14. 14

    给定日期时间范围内的随机日期时间

  15. 15

    给定日期时间范围内的随机日期时间

  16. 16

    给定日期范围内的第一个非空值

  17. 17

    在给定日期范围内查询BigQuery表

  18. 18

    MySQL-获取给定日期范围内的并发事件总数

  19. 19

    给定日期范围内活动用户的每日计数

  20. 20

    给定日期数组,将结果显示在“周”范围内

  21. 21

    熊猫-比较给定日期范围内小时平均值的平均值

  22. 22

    在给定日期范围内每天计数设备

  23. 23

    在给定日期范围内选择可用的客房

  24. 24

    Couchbase在给定日期范围内获取文档

  25. 25

    在特定日期范围内查找具有特定文本的文件

  26. 26

    T-SQL在给定日期范围内在同一天从同一客户查找多个订单

  27. 27

    T-SQL在给定日期范围内在同一天从同一客户查找多个订单

  28. 28

    SQL从给定日期选择前3条记录

  29. 29

    SQL从给定日期选择前3条记录

热门标签

归档