我公司的应用程序安装在客户端桌面上。应用程序将为安装的桌面上运行的每个软件将数据发送到服务器 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)。
再一次,抱歉,如果它令人困惑。谢谢你的帮助。
答案 0 :(得分:0)
由于给定(total_click
,client_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`