Я пытался сделать это с прошлой недели, но все еще не повезло.
Вот мои примерные данные:
mobile_no_1 | mobile_no_2 | distance | interaction_started_at | interaction_ended_at | min_distance | max_distance
----------- | ----------- | -------- | ---------------------- | -------------------- | ------------ | ------------
0111 | 0222 | 10.2 | 2020-04-11 09:00:10 | 2020-04-11 09:00:20 | 10.2 | 10.2
0111 | 0222 | 10.2 | 2020-04-11 09:00:30 | 2020-04-11 09:00:40 | 10.2 | 10.2
0111 | 0222 | 10.2 | 2020-04-11 09:00:50 | 2020-04-11 09:01:00 | 10.2 | 10.2
0111 | 0222 | 10.2 | 2020-04-11 09:01:10 | 2020-04-11 09:01:20 | 10.2 | 10.2
То, что я хочу, это получить среднее расстояние, мин минимального расстояния, максимального максимального расстояния и суммируйте продолжительность взаимодействия по разнице между началом и концом взаимодействия, затем сгруппируйте их по мобильным номерам 1 и 2, но я хочу сделать так, как если бы уже существовала пара мобильных номеров 1 и 2 Неважно, какой номер мобильного телефона 1, а какой номер мобильного телефона 2, его следует объединить
Я попытался с помощью eloquent это:
$interaction_list = Interaction::select(
'id',
'mobile_no_1',
'mobile_no_2',
DB::raw('ROUND(AVG(distance), 2) as distance'),
'interaction_started_at',
DB::raw('MIN(ROUND(min_distance, 2)) as min_distance'),
DB::raw('MAX(ROUND(min_distance, 2)) as max_distance'),
DB::raw('SUM(TIMESTAMPDIFF(SECOND, interaction_started_at, interaction_ended_at)) as duration')
)->groupBy('mobile_no_1', 'mobile_no_2')
->orderBy($sort, $order)
->offset($start)
->limit($length)
->get();
И это результат, который я получаю:
mobile_no_1 | mobile_no_2 | distance | interaction_started_at | min_distance | max_distance | duration
----------- | ----------- | -------- | ---------------------- | ------------ | ------------ | --------
0111 | 0222 | 10.2 | 2020-04-11 09:00:10 | 10.2 | 10.2 | 30
0222 | 0111 | 10.2 | 2020-04-11 09:01:10 | 10.2 | 10.2 | 10
Для avg, min, max и sum уже правильно, но я хочу, чтобы приведенный выше результат был 1 строкой только для этой выборки данных с длительностью, равной 10 + 30 = 40, поскольку он объединен в 1 строку.
Я смог получить результат, используя distinct()
до select()
вместо groupBy()
, но затем после получения других данных в таблице он становится неточным, поскольку в нем есть теракция мобильного номера 01234567892 с 0111111111, и запрос объединяет эту запись вместе как 01234567892 с 01234567893, следовательно, результат записи 01234567892 с 01111111 никогда не появляется в таблице, поэтому я считаю, что это уже неправильный подход.