首页 > 解决方案 > 检查用户是否在连续两天内被分配到多个会议

问题描述

所以,我有一张会议表和这些会议的参与者:

 id | callid | participants |    date    
----+--------+--------------+------------
  1 |      1 | {1,2}        | 2020-05-30
  2 |      2 | {1,2}        | 2020-05-01
  3 |      3 | {3,4}        | 2020-03-10

我创建了以下查询来隔离 reviewer_id 和他们的会议日期:

select *
      from (select r.id as reviewer_id, m.date as meeting_date
            from researcher r, meeting m
            where r.id = any (m.participants)
            order by r.id) u;

这给出了表:

 reviewer_id | meeting_date 
-------------+--------------
           1 | 2020-05-30
           1 | 2020-05-01
           2 | 2020-05-30
           2 | 2020-05-01
           3 | 2020-03-10
           4 | 2020-03-10

现在,这是我卡住的部分。我如何使用它来确定审阅者是否在连续两天内参加了多个会议?

我尝试过使用 PostgreSQLdatediff()函数:

select u.reviewer_id, u.meeting_date, date_part('day', u.meeting_date - row_number() over(order by u.meeting_date))
      from (select r.id as reviewer_id, m.date as meeting_date
            from researcher r, meeting m
            where r.id = any (m.participants)
            order by r.id) u;

但它一直在说:

operator does not exist: date - bigint

如果有人可以提供帮助,将不胜感激。

标签: sqlpostgresql

解决方案


问题是row_number()输出一个bigint. 有一个 operator -(date, integer),所以你需要做的就是强制bigint转换为integer

u.meeting_date - CAST(row_number() over(order by u.meeting_date) AS integer)

我认为您正在寻找这样的查询:

SELECT reviewer_id
FROM (SELECT r.id AS reviewer_id,
             m.date - 1 =
                lag(m.date) OVER (PARTITION BY r.id ORDER BY m.date)
                AS twice_in_a_row
      FROM researcher r
         JOIN meeting m
            ON r.id = ANY (m.participants)) AS q
WHERE twice_in_a_row;

推荐阅读