我们在优化一组都遵循相同模式的查询时遇到问题。
基本情况是我们有一张table( hours
)它根据项目代码记录个人每周的工作时间。
我们还有第二张table( rates
)记录每个人的历史小时工资。
我们要报工资总额( hours
* rate
)对于中的每个项目 hours
table
返回我们感兴趣的所有小时数的查询是
SELECT hours_job, SUM(hour_value) AS total_hours
FROM hours_table
WHERE hours_job_status = "1"
GROUP BY hours_job
我们需要把它加入 rates
table,最新的 rates_date
然而,在边缘情况下,个人在特定日期的利率可能大于1,在这些情况下,我们希望 MAX
率
这是当前的尝试,非常缓慢
SELECT hours_job, SUM(hour_value * rate_value) AS salary
FROM hours_table
JOIN rates_table ON rate_person_id = hours_person_id
WHERE hours_job_active = "1"
AND rate_date = (
SELECT MAX(rate_date)
FROM rates_table
WHERE hours_person_id = rate_person_id
AND hours_week >= rate_date
AND rate_active = 1
)
AND rt_rate = (
SELECT MAX(rate_value)
FROM rates_table
WHERE hours_person_id = rate_person_id
AND hours_week >= rate_date
AND rate_active = 1
GROUP BY hours_job
ORDER BY hours_job;
正如这里所建议的,这是一段数据和预期的结果
工时表
hours_id hours_person_id hours_week hours_job hours_value hours_job_active
1 1 "2020-06-12" 100 20 1
2 1 "2020-06-12" 101 10 1
3 1 "2020-06-12" 102 10 1
4 2 "2020-06-12" 100 30 1
5 2 "2020-06-12" 102 10 1
费率表
rate_id rate_person_id rate_date rate_value rate_type rate_active
1 1 "2020-04-01" 25.00 A 1
2 1 "2019-04-01" 20.00 A 1
3 1 "2018-04-01" 18.00 A 1
4 2 "2020-04-01" 20.00 A 1
5 2 "2020-04-01" 18.00 Y 1
预期结果是
hours_job salary
100 1100 ((20*25) + (30*20))
101 250 (10*25)
102 450 ((10*25) + (20*10))
1条答案
按热度按时间lyr7nygr1#
我已经很久没有遇到过这样的问题需要优化了,没有测试db,我无法确保它能正常工作,但是你试过这样的方法吗?