#sql #snowflake-cloud-data-platform
Вопрос:
Я пытаюсь запустить SQL, в котором я хочу увидеть первый номер поступления номера заказа на покупку и количество, полученное по первому номеру поступления.
Мой SQL извлекает первый номер квитанции, но я не получаю количество для первого номера квитанции, вместо этого я получаю общее количество приема номера puchase
вот мой SQL:
Select
a.Purchase_Order_Number,
min(b.Purchase_Receipt_Number) PO_Receipt_NUMBER,
min(c.Full_Date) Received_Date,
sum(b.TRANSACTION_RECEIVED_ITEM_QUANTITY) PO_Receive_Qty
from f_Purchase_Order a
join f_Purchase_Receipt b
on a.Purchase_Order_Key = b.Purchase_Order_Key
join d_Date c
on (b.Received_Date_Key = c.Date_Key)
where a.Purchase_Order_Number = '870892'
group by
a.Purchase_Order_Number
Комментарии:
1. Не могли бы вы заменить sum на first_value и посмотреть, работает ли это тоже? Оставив все точно так, как вы написали в первый раз . Возможно, вам подойдет больше, чем переписывать
Ответ №1:
Если вам нужен первый ряд, не используйте GROUP BY
. ORDER BY
и LIMIT
:
Select po.Purchase_Order_Number,
pr.Purchase_Receipt_Number,
d.Full_Date as Received_Date,
pr.TRANSACTION_RECEIVED_ITEM_QUANTITY as PO_Receive_Qty
from f_Purchase_Order po join
f_Purchase_Receipt pr
on po.Purchase_Order_Key = pr.Purchase_Order_Key join
d_Date d
on pr.Received_Date_Key = d.Date_Key
where pr.Purchase_Order_Number = '870892'
order by d.Date_Key
limit 1;
Обратите внимание, что я также исправил псевдонимы таблиц, чтобы они идентифицировали таблицы, из которых они взяты.
Редактировать:
Если вы хотите этого для всех Purchase_Order_Numbers
, вы бы использовали qualify
:
Select po.Purchase_Order_Number,
pr.Purchase_Receipt_Number,
d.Full_Date as Received_Date,
pr.TRANSACTION_RECEIVED_ITEM_QUANTITY as PO_Receive_Qty
from f_Purchase_Order po join
f_Purchase_Receipt pr
on po.Purchase_Order_Key = pr.Purchase_Order_Key join
d_Date d
on pr.Received_Date_Key = d.Date_Key
order by d.Date_Key
qualify row_number() over (partition by Purchase_Order_Key order d.Date_Key) = 1;
Комментарии:
1. спасибо теперь, как бы я получил весь первый номер квитанции каждого другого заказа на покупку при удалении пункта «ГДЕ».
2. @kodycarl . . . По иронии судьбы, это был мой первый ответ, который я затем переписал. Вы бы использовали
qualify
.
Ответ №2:
Вы суммируете ТРАНЗАКЦИЮ_РЕЗУЛЬТАТ_ИТЕМ_КОЛИЧЕСТВО по всем позициям в номере заказа на покупку (из-за «группировать по»). То, что вам действительно нужно, — это просто информация из номера первой покупки_рецепт_номера. Вы можете сделать это с помощью «топ-1» и «заказ по».
Select top 1
a.Purchase_Order_Number,
b.Purchase_Receipt_Number,
c.Full_Date,
b.TRANSACTION_RECEIVED_ITEM_QUANTITY
from f_Purchase_Order a
join f_Purchase_Receipt b
on a.Purchase_Order_Key = b.Purchase_Order_Key
join d_Date c
on (b.Received_Date_Key = c.Date_Key)
where a.Purchase_Order_Number = '870892'
order by
a.Purchase_Receipt_Number
Комментарии:
1.спасибо теперь, как бы я получил весь первый номер квитанции каждого другого заказа на покупку при удалении пункта «ГДЕ».