我使用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/