Объединение двух MySQL наборов данных по дате и идентификатору - PullRequest
0 голосов
/ 19 июня 2020

Я изо всех сил пытаюсь найти способ эффективно объединить два набора данных с помощью одного запроса

Первый набор данных может быть возвращен с помощью следующего запроса:

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 |

Из которого мы можем получить общее количество часов в неделю для каждой работы и т. Д. c ...

Наш второй набор данных дает нам почасовые ставки для каждого человека. Проблема в том, что эта таблица содержит как исторические , так и будущие почасовые ставки, поэтому объединение должно гарантировать, что ставка применяется к правильным 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 Как вы можете видеть, что у нас есть запрос, который возвращает правильные данные, но этот запрос не масштабируется до нашего текущего набора данных (1,8 млн строк и более подтаблиц)

Ответы [ 2 ]

0 голосов
/ 19 июня 2020
SELECT h.*,
       (SELECT rate_value
        FROM rates r
        WHERE h.hours_person_id = r.rate_person_id AND
              r.date <= h.date
        ORDER BY r.date DESC
        LIMIT 1
       ) as rate_value
FROM hours h

Я не понимаю, какое отношение active имеет к вопросу, потому что вам нужно go вернуться в прошлое. Затем вы можете агрегировать или делать все, что захотите, когда у вас будет правильная ставка на дату.

0 голосов
/ 19 июня 2020

Таким образом, ожидаемый результат будет для часов, превышающих норму от 01.05.2020, а значение 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 или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...