#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