Можно ли преобразовать строки в столбцы с помощью самосоединения SQL?

#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 .