Postgresql: Как мне присоединиться к одной таблице с условием where

#sql #postgresql #join

Вопрос:

У меня есть один столик statistic . В таблице есть step_index , например 1 2 , 3 и 4 . Мне нужно сделать запрос добавить week2 и total_request2 где неделя 37 , и присоединиться к таблице self с тем же step_index .

Пример:

 step_index|type    |year|week|total_request|
---------- -------- ---- ---- ------------- 
         1|Blasting|2021|  38|            1|
         2|Blasting|2021|  38|            1|
         3|Blasting|2021|  38|            1|
         4|Blasting|2021|  38|            1|
         1|Blasting|2021|  37|            6|
         2|Blasting|2021|  37|            6|
         3|Blasting|2021|  37|            6|
         4|Blasting|2021|  37|            6|
 

Результат должен быть:

 step_index|type    |year|week|total_request|week2|total_request2|
---------- -------- ---- ---- ------------- ----- -------------- 
         1|Blasting|2021|  38|            1|   37|             6|
         2|Blasting|2021|  38|            1|   37|             6|
         3|Blasting|2021|  38|            1|   37|             6|
         4|Blasting|2021|  38|            1|   37|             6|
 

Я попробовал внутреннее соединение и с предложением, но не получилось week2 и total_request2 .

Комментарии:

1. Если есть третья неделя, 39-я, то вы ожидаете 3-ю неделю и total_request3 ?

2. нет, я ожидаю 38-ю и 37-ю недели

Ответ №1:

  WITH CTE(STEP_INDEX,TYPE,YEAR,WEEK,TOTAL_REQUEST) AS
  (
    SELECT 1,'BLASTING',2021,38,1  UNION ALL 
    SELECT 2,'BLASTING',2021,38,1  UNION ALL 
    SELECT 3,'BLASTING',2021,38,1  UNION ALL 
    SELECT 4,'BLASTING',2021,38,1  UNION ALL 
    SELECT 1,'BLASTING',2021,37,6  UNION ALL 
    SELECT 2,'BLASTING',2021,37,6  UNION ALL
    SELECT 3,'BLASTING',2021,37,6  UNION ALL
    SELECT 4,'BLASTING',2021,37,6  
  )

 SELECT C.STEP_INDEX,C.TYPE,C.YEAR,C.WEEK,C.TOTAL_REQUEST,
   X.WEEK AS WEEK_2,X.TOTAL_REQUEST AS TOTAL_REQUEST_2
  FROM CTE AS C
 LEFT JOIN LATERAL
  (
     SELECT C2.STEP_INDEX,C2.TYPE,C2.YEAR,C2.WEEK,C2.TOTAL_REQUEST
     FROM CTE AS C2
      WHERE C.STEP_INDEX=C2.STEP_INDEX AND C.WEEK-1=C2.WEEK AND C.YEAR=C2.YEAR
  )X ON TRUE
  WHERE C.YEAR=2021 AND C.WEEK=38
 

На основе ваших выборочных данных

Ответ №2:

Основываясь на том, что вы предоставили, вот мое лучшее предположение о том, чего вы хотите. Если вы сможете уточнить первичные ключи и более конкретную информацию о том, что вы ищете, я могу пересмотреть свой запрос, чтобы он был лучше.

 select s.step_index
,s.type
,s.year
,s.week
,s.total_request
,s2.week
,s2.total_request2
from statistic s
,statistic s2
where s2.week = 37
and s2.step_index = s.step_index
and s.week = 38
 

Ответ №3:

Вы могли бы сделать это в явном JOIN виде . Правильный синтаксис был бы:

 select s.step_index, s.type, s.year, s.week, s.total_request,
       s2.week as week2, s2.total_request as total_request2
from statistic s join
     statistic s2
     on s2.year = s.year and
        s2.step_index = s.step_index and
        s2.week = 37 and
        s.week = 38