mysql - SQL - 获取一个月的新事件计数并仅显示增加的值

标签 mysql sql

我使用MySQL。我有一张包含事件历史记录的表。我正在努力实现以下目标

1) 获取 2015 年 3 月持续时间比 2015 年 2 月持续时间更长的事件(前提是该事件确实发生在 2015 年 2 月)。某个事件在一个月内可能发生任意多次。所以,对于初学者来说,我只是取平均持续时间。稍后会考虑百分位数。

2) 获取 2015 年 3 月特有的 3 月事件列表(当前与 2 月进行比较。但是将来,我可能有以下要求 - 获取与过去 6 个月相比的 3 月特有事件几个月 - 基本上是想找出新事件何时推出)

输出

我希望 (1) 的输出如下所示

MONTH,EVENT,DURATION
2015-03,Event1,1030
2015-03,Event2,365
2015-03,Event9,1010

对于 (2),我希望事件列表如下所示

MONTH,EVENT
2015-03,Event7
2015-03,Event2

关于上面的(1),我正在尝试下面的查询,但无法得到正确的结果。显然,由于我编写的查询的性质,输出中有 6 列。

select 
    * 
from
(
    (
        select
            month(EVE_DATE) as mon,
            EVE_ID as task,
            truncate(AVG(EVE_DURATION)/1000,2) as eve_dur
        from
            EVE_BOOKINGS
        where
            EVE_DATE >= '2015-02-01'
            and EVE_DATE <= '2015-02-31'
            and dayofweek(EVE_DATE) not in (1,7)
            and EVE_BOOKER = 'organizer'
            and EVE_ID <> ''
        group by
            mon,
            task
        order by 
            eve_dur desc
    ) t1,
    (    
        select
            month(EVE_DATE) as mon,
            EVE_ID as task,
            truncate(AVG(EVE_DURATION)/1000,2) as eve_dur
        from
            EVE_BOOKINGS
        where
            EVE_DATE >= '2015-03-01'
            and EVE_DATE <= '2015-03-31'
            and dayofweek(EVE_DATE) not in (1,7)
            and EVE_BOOKER = 'organizer'
            and CONFIDENCE = 'PROD'
            and EVE_ID <> ''
        group by
            mon,
            task
        order by 
            eve_dur desc
    ) t2   
)
where
        t2.eve_dur > t1.eve_dur

我可以请求指导来正确处理此查询吗?

最佳答案

您的示例中没有非交叉连接 - 我希望您不知道如何执行它们。例如,要获取三月份的项目,您可以采用子查询构造并像这样连接它们(我使用更标准的缩进样式)

SELECT *
FROM (
  SELECT month(EVE_DATE) as mon,      EVE_ID as task, truncate(AVG(EVE_DURATION)/1000,2) as eve_dur
  FROM EVE_BOOKINGS
  WHERE EVE_DATE >= '2015-02-01' and EVE_DATE <= '2015-02-31'
    AND dayofweek(EVE_DATE) not in (1,7)
    AND EVE_ID <> ''
  GROUP BY mon, task
) FEB
JOIN (    
  SELECT month(EVE_DATE) as mon,      EVE_ID as task, truncate(AVG(EVE_DURATION)/1000,2) as eve_dur
  FROM EVE_BOOKINGS
  WHERE EVE_DATE >= '2015-03-01' and EVE_DATE <= '2015-03-31'
    AND dayofweek(EVE_DATE) not in (1,7)
    AND EVE_ID <> ''
  GROUP BY mon, task
) MAR ON FEB.EVE_ID = MAR.EVE_ID

要查找三月中不在二月中的内容,请从三月中选择,但左连接到二月并找到“丢失”的内容

像这样

SELECT *
FROM (
  SELECT EVE_DATE, EVE_ID 
  FROM EVE_BOOKINGS
  WHERE EVE_DATE >= '2015-03-01' and EVE_DATE <= '2015-03-31'
    AND dayofweek(EVE_DATE) not in (1,7)
    AND EVE_ID <> ''
) MAR 
LEFT JOIN (    
  SELECT EVE_DATE, EVE_ID 
  FROM EVE_BOOKINGS
  WHERE EVE_DATE >= '2015-02-01' and EVE_DATE <= '2015-02-31'
    AND dayofweek(EVE_DATE) not in (1,7)
    AND EVE_ID <> ''
  GROUP BY mon, task
) FEB ON FEB.EVE_ID = MAR.EVE_ID
WHERE FEB.EVE_ID is null

关于mysql - SQL - 获取一个月的新事件计数并仅显示增加的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106933/

相关文章:

sql - 是否可以为 View 设置主键?

java - 如何使用 JDBC 获取 DEFAULT NULL?

mysql - 如果记录不存在mysql,则选择null

c# - Entity Framework :多对多排序

mysql - SQL 脚本中的变量数据库名称

sql - Linux机器上R MySQL中的字符编码

mysql - NotORM 的连接与多选

mysql - collectd - 如何安装 dbi 插件?

php - Codeigniter 事件记录类(从哪里选择)

c# - 不正确的字符串值 : '\xEF\xBF\xBD' for column