繁体   English   中英

如何选择统计表以统计两个日期之间的出现

[英]How to select statistics table counting occurrences between two dates

我需要从表中计算出协议违规的发生和两个日期之间的持续时间,以实现类似于统计表的效果,如下图所示:

预期效果:

在此处输入图片说明

说明:

如您所见,我需要选择“违规”表中现有的“国家/地区”,“站点”,以及同一表中“违规”中数据库中存在的协议违规期限的“数字”,“最大”,“最小”和“平均值” 在两个日期之间 因此,我们必须计算:

  • 按国家和网站侵犯表中的现有协议违规事件
  • 违反协议的国家/地区的最小/最大/平均持续时间

在两个不同的条件下:

  • 发现日期到报告日期的事件
  • 报告日期到确认日期的事件

数据库结构:

在SQLFILDDLE可用: 在这里查找

我将在附加的SQLFIDDLE中添加该代码,其中包含更多表和一个查询,但是对于此问题,它们现在是不必要的。 随意使用它。 我没有删除旧查询,因为有很好的方法:

  • '-全部-'和
  • '-未知-'值。 -

违规表:

create table violations (
  id long,
  country varchar(20),
  site varchar(20),
  status_id int,
  trial_id int,
  discovered_date date,
  reporded_date date,
  confirmed_date date
);

站点表:

create table site (
  id long,
  site varchar(20)
);

我的第一次尝试:

这是我的新SQLFIDDLE,其中的查询需要改进注释行:

SELECT v.country as country, v.site as site,
  COUNT(*) as N --,
  --MAX(list of durations in days between discovered date to repored date on each violation by country and site) as "Maximum",
  --MIN(list of durations in days between discovered date to repored date on each violation by country and site) as "Minimum",
  --AVG(list of durations in days between discovered date to repored date on each violation by country and site) as "Mean"
FROM violations v
WHERE v.trial_id = 3
GROUP BY ROLLUP (v.country, v.site)

我已经设法用我的想法创建了抽象查询。 但是我有一个问题要为MAX,MIN和AVG编写正确的查询,在这些查询中,我们必须从国家/地区和站点每次违规的discovered datereported date之间的天数列表中选择max / min / avg值。

请问你能帮帮我吗?

请检查此查询。 它经过简化,可能会给您一个想法和方向。 如果您需要更多,请告诉我。 复制并粘贴以查看结果。 此查询将仅选择和计算where子句中两个日期之间的结果。 您需要先运行内部查询,而无处查看所有日期等。此查询计算2个日期之间的违规情况。 不确定持续时间的天数列表...持续时间计数请参见下文。 您可以添加MAX / MIN等...

-- Days between (duration) = (end_date-start_date) = number of days (number) --
SELECT (to_date('14-MAR-2013') - to_date('01-MAR-2013')) days_between
  FROM dual
/


SELECT country, site
 , Count(*) total_viol
 , MAX(susp_viol) max_susp_viol
 , MIN(susp_viol) min_susp_viol
FROM
(
 SELECT 'GERMANY' country, '12222' site, 1 susp_viol, 2 conf_viol, trunc(Sysdate-30) disc_date, trunc(Sysdate-25) conf_date
   FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 3          , 14, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 6          , 25, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 2          , 1, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 10         , 5,  trunc(Sysdate-15) , trunc(Sysdate-10)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 15         , 3,  trunc(Sysdate-15) , trunc(Sysdate-10)  FROM dual
  UNION
 SELECT 'GERMANY',  'Unknown Site'     , 0          , 7,  trunc(Sysdate-5) ,  trunc(Sysdate-2)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 1          , 5,  trunc(Sysdate-20) ,  trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 2          , 10,  trunc(Sysdate-15) ,  trunc(Sysdate-12)  FROM dual
 UNION
SELECT 'RUSSIA',  'Unknown Site'      , 10          , 10,  trunc(Sysdate-3) ,  trunc(Sysdate-1)  FROM dual
 ) 
  -- replace sysdate with your_date-default format is to_date('14-MAR-2013') or give format mask
 WHERE conf_date BETWEEN trunc(Sysdate-20) AND trunc(Sysdate-10)
 GROUP BY ROLLUP (country, site)
 ORDER BY country, site
/

持续时间计数:

SELECT country, site, (conf_date-disc_date) duration, count(*) total_durations 
  FROM
 (
 SELECT 'GERMANY' country, '12222' site, 1 susp_viol, 2 conf_viol, trunc(Sysdate-30) disc_date, trunc(Sysdate-20) conf_date
   FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 3          , 14, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 6          , 25, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 2          , 1, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 10         , 5,  trunc(Sysdate-12) , trunc(Sysdate-6)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 15         , 3,  trunc(Sysdate-17) , trunc(Sysdate-11)  FROM dual
  UNION
 SELECT 'GERMANY',  'Unknown Site'     , 0          , 7,  trunc(Sysdate-5) ,  trunc(Sysdate-2)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 1          , 5,  trunc(Sysdate-20) ,  trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 2          , 10,  trunc(Sysdate-15) ,  trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'RUSSIA',  'Unknown Site'      , 10          , 10,  trunc(Sysdate-3) ,  trunc(Sysdate-1)  FROM dual
 ) 
 WHERE conf_date BETWEEN trunc(Sysdate-20) AND trunc(Sysdate-10) 
  GROUP BY ROLLUP (country, site, (conf_date-disc_date))
  ORDER BY country, site
 /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM