我正在努力找到一种方法来使用一个查询有效地连接两个数据集
可以使用以下查询返回Dataset one:
SELECT hours_person_id, hours_date, hours_job, SUM(hours_value) AS hours
FROM hours
WHERE hours_status = 1
GROUP BY hours_person_id, hours_date, hours_job
它提供了一个类似于
| 1 | 2020-06-07 | 101 | 25 |
| 1 | 2020-06-07 | 102 | 10 |
| 1 | 2020-06-07 | 103 | 5 |
| 2 | 2020-06-07 | 101 | 30 |
| 2 | 2020-06-07 | 104 | 10 |
从中我们可以得到每周,每个工作等的总时数。
我们的第二个数据集给出了每个人的小时费率。 问题是这个表同时包含历史和未来的小时费率,因此联接需要确保费率应用于正确的person_id和日期。 在一次约会中,一个人也可以有一个以上的费率。
下面给出了所有有效的费率
SELECT rate_person_id, rate_date, rate_value
FROM rates
WHERE rate_active = 1
可能看起来像
| 1 | 2020-01-01 | 20.00 |
| 1 | 2020-05-01 | 25.00 |
| 1 | 2020-07-01 | 22.00 |
| 2 | 2020-01-01 | 22.00 |
| 2 | 2020-05-01 | 24.00 |
| 3 | 2020-05-01 | 20.00 |
| 3 | 2020-05-01 | 21.00 |
| 3 | 2020-07-01 | 18.00 |
因此,对于高于2020-05-01
速率的小时,将是预期的结果,其中21.00
值是Person_ID===3
的结果
我正在寻找的东西可以在一个查询中完成,还是我最好加入两个子查询?
这里请求的更新是一个表示上述https://www.db-fiddle.com/f/OIUPTNAJY6M6ZTFZGRF4KT/0的fiddle,您可以看到我们有一个返回正确数据的查询,但是这个查询不能扩展到我们的curennt数据集(180万行和更多子表)
因此,对于2020-05-01的比率以上的小时,将是预期的结果,其中21.00值是person_id===1的结果
从您的速率输出中,person_id=1从未在速率值21.00上。
| 1 | 2020-01-01 | 20.00 |
| 1 | 2020-05-01 | 25.00 |
| 1 | 2020-07-01 | 22.00 |
对于一个人的两个有效比率,您需要的是最近的比率还是他工作的月份的比率。 如果没有这个月的利率,那么你想要0利率还是其他的。
SELECT h.*,
(SELECT rate_value
FROM rates r
WHERE h.hours_person_id = r.rate_person_id AND
r.date <= h.date
ORDER BY h.date DESC
LIMIT 1
) as rate_value
FROM hours h
我看不出active
与问题有什么关系,因为您需要回到时间。 然后,你可以汇总或做任何你想做的事情,一旦你有正确的比率在日期。