提问者:小点点

按日期和id连接两个MySQL数据集


我正在努力找到一种方法来使用一个查询有效地连接两个数据集

可以使用以下查询返回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万行和更多子表)


共2个答案

匿名用户

因此,对于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与问题有什么关系,因为您需要回到时间。 然后,你可以汇总或做任何你想做的事情,一旦你有正确的比率在日期。