MySQL:在我的情况下需要查询帮助吗
我的公司在客户端桌面上安装了应用程序。应用程序将以total\u单击的方式向服务器发送已安装桌面上运行的每个软件的数据。我想知道按日期范围过滤的特定软件的点击次数 问题是,应用程序总是带有“total\u click”值(每个客户端都带有不同的total\u click)。例如,在第一天,软件A有10次点击,而在第二天,只运行一次的软件A将向服务器发送11次点击总数。所以,为了获得第2天的总点击量的有效数据,我需要用第1天的总点击量减去第2天的总点击量。我知道这让人困惑,但我也很难解释这个问题 表结构示例 表数据示例 ms\u单击MySQL:在我的情况下需要查询帮助吗,mysql,Mysql,我的公司在客户端桌面上安装了应用程序。应用程序将以total\u单击的方式向服务器发送已安装桌面上运行的每个软件的数据。我想知道按日期范围过滤的特定软件的点击次数 问题是,应用程序总是带有“total\u click”值(每个客户端都带有不同的total\u click)。例如,在第一天,软件A有10次点击,而在第二天,只运行一次的软件A将向服务器发送11次点击总数。所以,为了获得第2天的总点击量的有效数据,我需要用第1天的总点击量减去第2天的总点击量。我知道这让人困惑,但我也很难解释这个问题
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月4日用SUMtotal\u click减去4月1日的SUMtotal\u click
但是我怎样才能在4月1日和4月2日之间获得点击总数?在4月2日,客户端id3不发送任何数据,因此,如果我在4月2日用SUMtotal\u click减去SUMtotal\u click,则在4月1日它将返回负结果(根据数据示例,它应返回30)
再一次,如果让人困惑,我很抱歉。感谢您的帮助。由于给定(
客户端id
,应用程序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
LEFT JOIN
(以及外部选择列表中的COALESCE()
)说明了在“开始”日期(解释为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`
您能发布一个您期望的查询输出的示例吗?您的描述令人困惑,因为它暗指聚合SUM()
,但也指日期之间的减法SUM()
通常不进行任何减法,在中用限制日期,在中,其中
从上面的数据示例来看,“SUM()”在4月1日和4月2日之间单击的有效结果是30,4月1日和4月3日的有效结果是130,依此类推。哇,它工作得很好!谢谢!虽然查询需要2-3分钟(ms_click有100-200万行),但我认为我可以自己修复它。
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
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`