#sql #postgresql #pivot #inner-join #self-join
#sql #postgresql #сводная #внутреннее соединение #самосоединение
Вопрос:
Мне нужна была помощь в самосоединении для приведенной ниже таблицы, скажем, datarate_tbl
Мне нужно сравнить данные для двух дат, скажем, для 18-й и 20-й даты из одной таблицы. Мне нужно запросить данные для извлечения данных из той же таблицы, чтобы выровнять данные для file_size и оценить столбец по стороне 18th данных
Запрашиваемые данные должны выглядеть следующим образом
Я попытался написать запрос, используя самосоединение, но dint работал, чтобы получить набор данных результата. Буду признателен за любую помощь
У меня есть запрос, который дает мне дополнительные две строки вместо 5. Проблема возникает в net parallel.
select a.date::date ,a.hostname,a.test_type,a.file_size,a.rate ,b.date::date ,b.file_size ,b.rate
from checkperf_allproduct_metrics a
left join(select * from checkperf_allproduct_metrics where date::date = '2020-12-18') b
on a.instance = b.instance
and a.hostname=b.hostname
and a.test_type =b.test_type
where a.instance = 'nytpsg00394'
and a.date::date = '2020-12-20'
;
date | hostname | test_type | file_size | rate | date | file_size | rate
------------ -------------------------------------------------------- -------------- ------------ ------------- ------------ ------------ -------------
2020-12-20 | abc.com.in | disk write | 1073741824 | 297.67 | 2020-12-18 | 1073741824 | 344.78
2020-12-20 | abc.com.in | disk read | 1073741824 | 3413.33 | 2020-12-18 | 1073741824 | 2438.10
2020-12-20 | abc.com.in | stream | 0 | 15887.52 | 2020-12-18 | 1073741824 | 15116.31
2020-12-20 | abc.com.in-> abc.com.in| Net Parallel | | 3187.470000 | 2020-12-18 | 1073741824 | 3285.460000
2020-12-20 | abc.com.in-> abc.com.in| Net Parallel | | 3187.470000 | 2020-12-18 | 1073741824 | 3215.270000
2020-12-20 | abc.com.in-> abc.com.in| Net Parallel | | 3163.380000 | 2020-12-18 | 1073741824 | 3285.460000
2020-12-20 | abc.com.in-> abc.com.in| Net Parallel | | 3163.380000 | 2020-12-18 | 1073741824 | 3215.270000
На самом деле проблема возникает в сетевом параллельном столбце. Если вы можете помочь мне исправить это.
Ответ №1:
Я бы рекомендовал условную агрегацию:
select hostname, test_type,
max(file_size) filter(where date = date '2020-12-18') as file_size_18,
max(rate) filter(where date = date '2020-12-18') as rate_18,
max(file_size) filter(where date = date '2020-12-20') as file_size_20,
max(rate) filter(where date = date '2020-12-20') as rate_20
from mytable t
where date in (date '2020-12-18', date '2020-12-20')
group by hostname, test_type
Комментарии:
1. Большое спасибо GMB за ответ. 2-й очень близок, но у меня была та же проблема, из-за которой некоторые строки дублируются. Ну, первый вариант может не работать в postgress. Не могли бы вы помочь предоставить запрос в postgress
2. @Asrar: второй запрос не приведет к дублированию ваших выборочных данных. Что касается первого, это поддерживаемый синтаксис в Postgres. Попробуйте (я только что обновил идентификатор)
3. Мне помог GMB 2nd, который дает мне две дополнительные строки, которых я хочу избежать.
4. Первая вмятина дала желаемые результаты. Я сделал редактирование, если вы можете помочь мне исправить запрос, чтобы получить 5 строк, размещенных в нужном наборе данных
5. @Asrar: используйте первый запрос. Я удалил другой. Я гарантирую одну строку для каждого имени хоста и testtype
Ответ №2:
Попробуйте использовать max с функцией filter в sql-запросе, подобном этому.
select hostname, test_type,
max(file_size) filter(where date::date = date '2020-12-18') as file_size_18,
max(rate) filter(where date::date = date '2020-12-18') as rate_18,
max(file_size) filter(where date::date = date '2020-12-20') as file_size_20,
max(rate) filter(where date::date = date '2020-12-20') as rate_20
from checkperf_allproduct_metrics t
where date::date in (date '2020-12-18', date '2020-12-20')
group by hostname, test_type;
Вывод
hostname | test_type | file_size_18 | rate_18 | file_size_20 | rate_20
-------------------------------------------------------- -------------- -------------- ------------- -------------- -------------
abc.com.in | disk read | | | 1073741824 | 2925.71
abc.com.in | disk write | | | 1073741824 | 449.12
abc.com.in | stream | | | 0 | 15354.96
abc.com.in->abc.com.in| Net Parallel | | | | 3164.820000
abc.com.in | disk read | 1073741824 | 2438.10 | 1073741824 | 3413.33
abc.com.in | disk write | 1073741824 | 344.78 | 1073741824 | 297.67
abc.com.in | stream | 1073741824 | 15116.31 | 0 | 15887.52
abc.com.in-> abc.com.in| Net Parallel | 1073741824 | 3285.460000 | | 3187.470000
Комментарии:
1. Я думаю, что у вашего имени хоста или типа есть несколько записей с пробелами. Попробуйте использовать trim как в group by, так и в select .