2017-08-25 78 views
3

我有问题。所以,我在此数组数据:从2个不同天获取数据并比较

id  idm   amount   date 
1  5   10    2017-08-23 12:12:12 
2  5   20    2017-08-23 12:14:16 
3  6   13    2017-08-23 18:00:00 
4  5   25    2017-08-24 19:00:00 
5  5   160    2017-08-24 19:30:00 

这样的想法是从迄今为止获得2017-08-23量的总和,并与日期2017-08-24比较。如果用户的这两个值之间的差异大于20,例如在这种情况下,我找到了一个用户。

我的建议是让2 SQL的:

select sum(amount) as previous_amount, idm 
FROM table 
WHERE date >= '2017-08-23 00:00:00' AND date <= '2017-08-23 23:59:59' 
GROUP By idm 

select sum(amount) as actual_amount, idm 
FROM table 
WHERE date >= '2017-08-24 00:00:00' AND date <= '2017-08-24 23:59:59' 
GROUP By idm 

,并在PHP中的处理,但可能存在梅索德做,在SQL。你能帮我吗 ? Thx提前,并为我的英语感到抱歉。

+0

什么期望从你的采样数据输出? –

+0

'idm''差异'如果大于20 – user7424312

+0

是否每20个差异'idm'?你能展示预期的结果吗? (即'idm = 6'只有1个条目,因此你认为没有区别?) – urban

回答

1

如果我理解正确的,这是你想要的东西:

select 
idm, 
sum(case when date >= '2017-08-23 00:00:00' AND date <= '2017-08-23 23:59:59' then amount end) - 
sum(case when date >= '2017-08-24 00:00:00' AND date <= '2017-08-24 23:59:59' then amount end) as diff 
from your_table 
group by idm 
having diff not between -20 and 20 
+0

我们是否可以得到只有在两个日期都有数据的用户,我的意思是如果用户在2017-08-23和2017-08-24上有金额,那么我们得到这个用户,否则没有 – user7424312

+0

@ user7424312 - 那么请检查编辑回答 –

1

没有测试,但是这可能工作..

select (sum(b.amount) - sum(a.amount)) as result, idm 
from table a join table b on a.idm = b.idm 
where a.date = date('2017-08-23') and b.date = date('2017-08-24') 
group by idm 

,如果你能提供一个小提琴,可以帮助我们来帮助你。

0

试一下,应该比@Shuddh解决方案更快,因为它不依赖于联接

SELECT 
    idm, 
    sum(IF(date(`date`) = '2017-08-23', amount, 0)) as amountDay1, 
    sum(IF(date(`date`) = '2017-08-24', amount, 0)) as amountDay1, 

    sum(IF(date(`date`) = '2017-08-23', amount, 0)) 
    - sum(IF(date(`date`) = '2017-08-24', amount, 0)) as diffDay1Day2 
FROM 
    table 
GROUP BY 
    idm 
+0

不按预期工作 – user7424312

+1

这只是给你一个提示,让你在正确的方向。你可以找到你自己的解决方案 – Benvorth

+0

@Benvorth我使用了join,这样可以忽略idm只存在于任何一个日期的情况。 – Shuddh

0

我的做法会是要计算每idmday(我将告诉你如何)的差异,并在代码中执行其余部分。因此,在第一部分中,我使用了操作函数将日期时间值中的时间元素删除,只保留日期为字符串。现在这是很值得我们组:

select sum(amount) as previous_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
FROM test 
GROUP By idm, day 
order by idm, day 

这会给你这样的:

previous_amount idm day 
30    5 2017-08-23 
185    5 2017-08-24 
13    6 2017-08-23 

在这一点上,我将继续代码。但是,如果您想在数据库中执行此操作,则需要在其上面加入上述结果表。这模拟了LAG/LEAD行为(两个Oracle指令在MySQL中不可用)。因此,查询是:

select 
    diff1.idm, 
    previous_amount, 
    actual_amount, 
    diff2.actual_amount-diff1.previous_amount as difference, 
    diff1.day as from_day, 
    diff2.day as to_day 
from (
    select sum(amount) as previous_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
    FROM test 
    GROUP By idm, day 
    order by idm, day 
) as diff1 
left join (
    select sum(amount) as actual_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
    FROM test 
    GROUP By idm, day 
    order by idm, day 
) as diff2 on diff1.idm=diff2.idm 
where DATE(diff2.day) > DATE(diff1.day) 
    and diff2.actual_amount-diff1.previous_amount > 20; 

上面的样子的结果:

idm previous_amount actual_amount difference from_day to_day 
5 30    185    155   2017-08-23 2017-08-24 

注意的是,上面的查询保证DAY2>第1天,但不强制一天只区别。不过,我认为它可以相当容易地扩展到这样做。

sqlfiddle这里

更新#1

如果你想保证一天的差异则更换where条件与TIMESTAMPDIFF(DAY, diff1.day, diff2.day) = 1fiddle

+0

@ user7424312的作品?问题吗? – urban