[英]SQL/BigQuery - List of products sold together
你好嗎?
我有一個包含 DATE、TICKET_ID(交易 ID)和 PRODUCT_ID(已售產品)的銷售表。 我想要一份每天一起銷售的商品清單(也就是說,今天產品 X 和產品 Y 一起銷售了 10 次,昨天產品 X 和產品 Y 一起銷售了 5 次......)
我有這個代碼,但是它有兩個問題:
1-生成反向重復。 例子:
product_id product_id_bought_with counting
12345 98765 130
98765 12345 130
abcde fghij 88
fghij abcde 88
2-此代碼在沒有數據列的情況下運行良好。 輸入后數據量要大得多,並且出現限制錯誤。 “查詢執行期間資源超出:無法在分配的 memory 中執行查詢。峰值使用量:限制的 152%。頂部 memory 消費者:ORDER BY 操作:99% 其他/未歸因:1%”
我的代碼:
SELECT
c.DATE,
c.product_id,
c.product_id_bought_with,
count(*) counting
FROM ( SELECT a.DATE, a.product_id, b.product_id as product_id_bought_with
FROM `MY-TABLE` a
INNER JOIN `THE-SAME-TABLE` b
ON a.ID_TICKETS = b.ID_TICKETS
AND a.product_id != b.product_id
AND a.DATE = b.DATE
) c
GROUP BY DATE, product_id, product_id_bought_with
ORDER BY counting DESC
我對如何做到這一點持開放態度。 提前致謝!
編輯:示例示例
CREATE TABLE `project_id.dataset.table_name` (
DAT_VTE DATE,
ID_TICKET STRING,
product_id int
);
INSERT INTO `project_id.dataset.table_name` (DAT_VTE, ID_TICKET, product_id)
VALUES
(DATE('2022-01-01'), '123_abc', 876123),
(DATE('2022-01-01'), '123_abc', 324324),
(DATE('2022-01-02'), '456_def', 876123),
(DATE('2022-01-02'), '456_def', 324324),
(DATE('2022-01-02'), '456_def', 432321),
(DATE('2022-05-23'), '987_xyz', 876123),
(DATE('2022-05-23'), '987_xyz', 324324)
根據您的要求,您可以嘗試以下查詢:
with mytable as(
select *,row_number()over (partition by DAT_VTE,ID_TICKET)rownum from `project_id.dataset.MY-TABLE`
)
select DAT_VTE
,product_id
,product_id_bought_with
,count(*) counting
from (
select a.DAT_VTE,a.ID_TICKET,a.product_id as product_id, b.product_id as product_id_bought_with
from mytable a
join mytable b
ON a.ID_TICKET = b.ID_TICKET
AND a.DAT_VTE = b.DAT_VTE
and a.rownum <b.rownum
)
GROUP BY DAT_VTE, product_id, product_id_bought_with
根據您提供的錯誤,資源超出錯誤通常在操作需要在單個計算單元上收集所有數據時觸發,如果不適合,則作業將失敗。 對大量數據進行排序涉及大量計算資源,如果使用分區,則可以更好地利用這些資源。
以下是解決您的問題的方法:
2 您也可以嘗試拆分查詢,將每個單獨的子/內部查詢的結果寫入另一個表作為臨時存儲空間以供進一步處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.