MySQL:在我的案例中需要查询帮助

时间:2015-04-18 13:58:36

标签: mysql

我公司的应用程序安装在客户端桌面上。应用程序将为安装的桌面上运行的每个软件将数据发送到服务器 total_click 。我想知道按日期范围过滤的某些软件的点击次数。

问题是,应用程序将始终带有'total_click'值(并且每个客户端都带有不同的 total_click )。例如,在第1天,软件A有10次点击,第二天,只运行一次的软件A将向服务器发送11 total_click 。因此,要获得第2天总点击的有效数据,我需要在第2天减去总点击次数,并在第1天完全点击。我知道这很令人困惑,但我也很难解释这个问题。

表结构示例

ms_client  
- [PK]client_id (int)  

ms_software  
- [PK]software_id (int)

ms_click
- [PK]click_id (int)
- [FK]client_id (int)
- [FK]software_id (int)
- date (date)
- total_click (int)

表数据示例

ms_click

Click_ID    Client_ID    Software_ID    Total_Click    Date
1           1            1                      100    01/04/2015
2           2            1                       10    01/04/2015
3           3            1                     1000    01/04/2015

4           1            1                      120    02/04/2015
5           2            1                       20    02/04/2015

6           2            1                       40    03/04/2015
7           3            1                     1100    03/04/2015

4           1            1                      150    04/04/2015
5           2            1                       50    04/04/2015
5           3            1                     1200    04/04/2015

如您所见,4月1日至4月4日期间很容易获得 total_click 。我要做的就是4月4日 SUM total_click ,并在4月1日用 SUM total_click 减去它。< / p>

但是如何在4月1日到4月2日之间获得 total_click ? 4月2日,如果我在4月2日用 SUM SUM total_click ', client_id 3就不会发送任何数据> total_click 4月1日它将返回减去结果(根据数据示例,它应该返回30)。

再一次,抱歉,如果它令人困惑。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

由于给定(total_clickclient_id)的application_id永不减少,您可以在每个客户端和每个应用程序的基础上确定有效的点击数字,如下所示:

select client_id, software_id, MAX(total_click) as total_click
from ms_click
where date <= $target_date
group by client_id, software_id

您可以使用它来获取截至边界范围的每个日期的最新total_clicks报告,并采取差异:

select
  to_stats.client_id,
  to_stats.software_id,
  to_stats.total_click - coalesce(from_stats.total_click, 0)
from (
    select client_id, software_id, MAX(total_click) as total_click
    from ms_click
    where date <= $from_date
    group by client_id, software_id
  ) to_stats
  left join (
    select client_id, software_id, MAX(total_click) as total_click
    from ms_click
    where date <= $to_date
    group by client_id, software_id
  ) from_stats
    on from_stats.client_id = to_stats.client_id
      and from_stats.software_id = to_stats.software_id

LEFT JOIN(以及外部选择列表中的COALESCE())说明某些软件在“起始”日期之前可能没有点击报告的可能性(被解释为0 )。当然,您需要将感兴趣的特定“到”和“从”日期提供给查询。

答案 1 :(得分:0)

不确定你要求的是什么,但我的猜测是:

SELECT t.*, COALESCE(t.total_click-MAX(t1.Total_Click),t.total_click) as clicks
FROM ms_click t 
LEFT JOIN ms_click t1
ON t.client_id=t1.client_id
  AND t.`date`>t1.`date`
GROUP BY t.client_id, t.`date`

http://sqlfiddle.com/#!9/3d7c5/1