【问题标题】:SQL/BigQuery - List of products sold togetherSQL/BigQuery - 一起销售的产品列表
【发布时间】:2022-08-19 21:03:09
【问题描述】:

你好吗?

我有一个包含 DATE、TICKET_ID(交易 ID)和 PRODUCT_ID(已售产品)的销售表。我想要一份 PER DAY 一起售出的商品清单(即今天产品 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-此代码在没有数据列的情况下运行良好。输入后数据量要大得多,并且出现限制错误。\"查询执行期间资源超出:无法在分配的内存中执行查询。峰值使用量:限制的 152%。顶级内存使用者: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)
  • 你能提供你正在使用的样本数据吗?
  • 当然!请检查更新的描述 =)

标签: sql google-bigquery


【解决方案1】:

根据您的要求,您可以尝试以下查询:

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

根据您提供的错误,资源超出错误通常在操作需要在单个计算单元上收集所有数据时触发,如果它不适合,则作业将失败。订购大量数据涉及大量计算资源,如果使用partitions,则可以更好地利用这些资源。

以下是解决您的问题的方法:

1 通常分区有助于解决documentation 和此link 中给出的资源问题。

2 您也可以尝试拆分查询,将每个单独的子/内部查询的结果写入另一个表作为临时存储空间以供进一步处理。

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多