gpt4 book ai didi

mysql - 每周提取趋势数据

转载 作者:行者123 更新时间:2023-11-29 13:11:53 25 4
gpt4 key购买 nike

我试图每周提取一些总和,我构建的查询获取数据,但速度慢得可怕。

 SELECT app_client_id
, (SELECT COUNT(b.app_id) FROM `li_appointments` AS b
WHERE YEARWEEK(b.app_datetime) = YEARWEEK(DATE_ADD(NOW(),INTERVAL -1 WEEK))
AND b.app_client_id = a.app_client_id)
, (SELECT COUNT(b.app_id) FROM `li_appointments` AS b
WHERE YEARWEEK(b.app_datetime) = YEARWEEK(DATE_ADD(NOW(),INTERVAL -2 WEEK))
AND b.app_client_id = a.app_client_id)
FROM `li_appointments` AS a

解释给了我这个:

 |id||select_type       ||table||type ||possible_keys||key  ||key_len||ref||rows ||Extra    |
|1 ||PRIMARY ||a ||index|\N |Extra||18 |\N |61901||Using index|
|3 ||DEPENDENT SUBQUERY||b ||index|\N |Extra||18 |\N |61901||Using where; Using index|
|2 ||DEPENDENT SUBQUERY||b ||index|\N |Extra||18 |\N |61901||Using where; Using index|

所引用的表是:

 create table `li_appointments` (
`app_id` int (11),
`app_datetime` datetime ,
`app_facility` varchar (600),
`app_department` varchar (600),
`app_address` varchar (600),
`app_language` varchar (600),
`app_requesting_person` varchar (600),
`app_service_provider` varchar (600),
`app_client_id` int (11),
`app_client_other` varchar (600),
`app_medicaid_status` int (11),
`app_health_program` varchar (150),
`les_name` varchar (500),
`les_dob` varchar (75),
`les_medicaid_id` varchar (500),
`billing_total_time` time ,
`billing_workorder_received` int (11),
`billing_admin_fee` float ,
`billing_notes` varchar (3000),
`app_notes` varchar (3000),
`created_by` varchar (300),
`created_on` datetime ,
`modified_by` varchar (300),
`modified_on` datetime ,
`wo_entered_by` varchar (300),
`app_callback_num` varchar (135),
`terp_id` varchar (135),
`app_covered_by` varchar (135),
`covered_on` datetime ,
`uofu_csn` varchar (135));

有没有更好的方法来获取这些数据?

最佳答案

这可能很慢,因为您所有的 WHERE 子句都使用诸如 YEARWEEK(b.app_datetime) 之类的内容,这些内容阻止使用索引以及您正在使用子选择的事实。

我不太明白你为什么要使用子选择。一个简单的 case 语句应该可以消除这样的需求:

SELECT
app_client_id,
SUM(
CASE
WHEN app_datetime > DATE_ADD(NOW(),INTERVAL -1 WEEK) THEN 1
ELSE 0
END
) AS last_week_count,
SUM(
CASE
WHEN app_datetime > DATE_ADD(NOW(),INTERVAL -1 WEEK) THEN 0
WHEN app_datetime > DATE_ADD(NOW(),INTERVAL -2 WEEK) THEN 1
ELSE 0
END
) AS two_weeks_ago_count
FROM `li_appointments`
GROUP BY app_client_id

确保您在 app_client_id 上有索引。

还应该指出的是,这将提供每周滚动的数据集。在您最初的问题中,您使用的是 YEARWEEK() ,它实际上可以一次提供一周以上的数据。例如,假设今天是星期三,我想计算 YEARWEEK() 等于上星期三的所有项目。这实际上会匹配前一周从 SUN/MON 到 SAT/SUN 的所有项目(周的开始和结束取决于您的 MySQL 在周编号方面的运行模式)。

如果这确实是您想要的,则更容易实现:

SELECT
app_client_id,
YEARWEEK(app_datetime) AS year_week,
SUM(1) as weekly_count
FROM `li_appointments`
GROUP BY `app_client_id`, `year_week`
HAVING `year_week` < YEARWEEK(NOW())
ORDER BY `year_week` DESC
LIMIT 2

这将为您提供过去两周的数据,但不是本周的数据。如果您想要当前一周(可能长达 6 天,23:59:59 长),只需删除 HAVING 子句即可。

关于mysql - 每周提取趋势数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com