Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较可用性和预订的事件以计算一天中可用的分钟数_Sql_Postgresql - Fatal编程技术网

Sql 比较可用性和预订的事件以计算一天中可用的分钟数

Sql 比较可用性和预订的事件以计算一天中可用的分钟数,sql,postgresql,Sql,Postgresql,我想写一个查询,告诉我哪几天有一种方法: 子查询、日期部分函数、SUM和CASE语句的组合,用于标记剩余>=45分钟的ID 该解决方案假定事件表中的ID是外键,并且可以多次出现,而availabilities表中的ID是主键 使用此ID,可以计算会话中的总分钟数,并将计算出的总事件分钟数与每个事件时间进行偏移 SELECT av.id, av.start_time, av.end_time, DATE_PART('hour', start_time - end_time)

我想写一个查询,告诉我哪几天有一种方法:

子查询、日期部分函数、SUM和CASE语句的组合,用于标记剩余>=45分钟的ID

该解决方案假定事件表中的ID是外键,并且可以多次出现,而availabilities表中的ID是主键

使用此ID,可以计算会话中的总分钟数,并将计算出的总事件分钟数与每个事件时间进行偏移

SELECT
   av.id,
   av.start_time,
   av.end_time,
   DATE_PART('hour', start_time - end_time) * 60 +
   DATE_PART('minute',  start_time - end_time) AS session_mins_available,
   COALESCE(TOTAL_MIN_USED,0) AS TOTAL_MIN_USED,
   DATE_PART('hour', start_time - end_time) * 60 +
   DATE_PART('minute',  start_time - end_time) - COALESCE(TOTAL_MIN_USED,0) AS MINUTES_AVAILABLE,
   CASE WHEN DATE_PART('hour', start_time - end_time) * 60 +
             DATE_PART('minute',  start_time - end_time) - COALESCE(TOTAL_MIN_USED,0)
   <=-45 THEN 'TRUE' ELSE 'FALSE' END AS FLAG
FROM availabilities av
LEFT JOIN
   (SELECT 
       e.id,
       SUM(MINUSED) AS TOTAL_MIN_USED
    FROM
       (SELECT
       E.id,
       E.start_time,
       E.next_start_time,
       E.end_time,
       DATE_PART('hour', start_time - COALESCE(next_start_time, end_time)) * 60 +
       DATE_PART('minute',  start_time - COALESCE(next_start_time, end_time)) AS MINUSED
       FROM
       (SELECT e.start_time, 
           lead(e.start_time) over (PARTITION BY e.ID ORDER BY e.start_time) as next_start_time, 
           e.end_time,
           e.id
        FROM events e
       )E
      )e
   GROUP BY e.id
 )EVENTTIMES
 ON av.id = EVENTTIMES.id
LEAD函数用于将相对于每个ID的下一个事件开始时间与前一个事件开始时间放在同一行上

如果没有下一个事件开始时间,则将事件时间计算为事件结束时间

 COALESCE(next_start_time, end_time) 
最后,添加一个案例语句将标记可用性ID,其中总剩余分钟数>=45

一种方法:

子查询、日期部分函数、SUM和CASE语句的组合,用于标记剩余>=45分钟的ID

该解决方案假定事件表中的ID是外键,并且可以多次出现,而availabilities表中的ID是主键

使用此ID,可以计算会话中的总分钟数,并将计算出的总事件分钟数与每个事件时间进行偏移

SELECT
   av.id,
   av.start_time,
   av.end_time,
   DATE_PART('hour', start_time - end_time) * 60 +
   DATE_PART('minute',  start_time - end_time) AS session_mins_available,
   COALESCE(TOTAL_MIN_USED,0) AS TOTAL_MIN_USED,
   DATE_PART('hour', start_time - end_time) * 60 +
   DATE_PART('minute',  start_time - end_time) - COALESCE(TOTAL_MIN_USED,0) AS MINUTES_AVAILABLE,
   CASE WHEN DATE_PART('hour', start_time - end_time) * 60 +
             DATE_PART('minute',  start_time - end_time) - COALESCE(TOTAL_MIN_USED,0)
   <=-45 THEN 'TRUE' ELSE 'FALSE' END AS FLAG
FROM availabilities av
LEFT JOIN
   (SELECT 
       e.id,
       SUM(MINUSED) AS TOTAL_MIN_USED
    FROM
       (SELECT
       E.id,
       E.start_time,
       E.next_start_time,
       E.end_time,
       DATE_PART('hour', start_time - COALESCE(next_start_time, end_time)) * 60 +
       DATE_PART('minute',  start_time - COALESCE(next_start_time, end_time)) AS MINUSED
       FROM
       (SELECT e.start_time, 
           lead(e.start_time) over (PARTITION BY e.ID ORDER BY e.start_time) as next_start_time, 
           e.end_time,
           e.id
        FROM events e
       )E
      )e
   GROUP BY e.id
 )EVENTTIMES
 ON av.id = EVENTTIMES.id
LEAD函数用于将相对于每个ID的下一个事件开始时间与前一个事件开始时间放在同一行上

如果没有下一个事件开始时间,则将事件时间计算为事件结束时间

 COALESCE(next_start_time, end_time) 


最后,添加一个case语句将标记可用性ID,其中剩余总分钟数>=45

请提供一些示例数据和表结构以及所需的输出无关,但是:
提取(EPOCH FROM availabilities.end\u time-availabilities.start\u time)::int/60>=45
可以简化为
结束时间-可用性。开始时间>=间隔“45分钟”
@jimmy8ball我刚刚更新了我的question@a_horse_with_no_name更简单,谢谢如果我理解正确的话,您需要查看在计算出每个id的事件总数后,可用时间还有多少分钟?请提供一些示例数据和表结构以及所需的输出无关,但是:
EXTRACT(EPOCH from availabilities.end\u time-availabilities.start\u time)::int/60>=45
可以简化为
结束时间-可用性。开始时间>=间隔“45分钟”
@jimmy8ball我刚刚更新了我的question@a_horse_with_no_name更简单,谢谢如果我理解正确的话,您需要查看在计算出每个id的事件总数后,离可用时间还有多少分钟?结束,但事件之间的一系列5分钟间隔可能会累积到所需的总时间(例如45分钟),将日期标记为可用是的,我看到了问题,因此我认为最好的方法,如果忽略事件之间的分钟数,则需要从事件开始时间到下一个事件开始时间作为单个事件时间进行测量,这样,事件之间的分钟数就不会显示为可用性。我会更新的,听起来会有用的。期待着看到您的更新为您进行此跑步?我在PSQL11上运行时遇到一些引用错误。第一个错误是表“事件”的子句条目中缺少
第11行。然后经过调试,我得到了一些more@JamesJohnson-我认为这只是因为我没有重复引用SEQ,现在应该可以了,我已经改为“SEQ”close,但事件之间的一系列5分钟间隔可能会累积到所需的总时间(例如45分钟),将日期标记为可用是的,我看到了问题,因此,我认为最好的方法是,如果忽略事件之间的分钟数,则需要从事件开始时间到下一个事件开始时间作为单个事件时间进行测量,这样,事件之间的分钟数就不会显示为可用性。我会更新的,听起来会有用的。期待着看到您的更新为您进行此跑步?我在PSQL11上运行时遇到一些引用错误。第一个错误是表“事件”的子句条目中缺少
第11行。然后经过调试,我得到了一些more@JamesJohnson-我想很简单,我没有重复引用SEQ,现在应该可以了,我改为“SEQ”