【问题标题】:Rank by DATETIME in BigQuery在 BigQuery 中按 DATETIME 排名
【发布时间】:2020-11-22 08:58:55
【问题描述】:

我有以下表架构:

Field name      Type        Mode        Policy tags     Description
order_id        STRING      NULLABLE        
customer_id     INTEGER     NULLABLE        
order_datetime  TIMESTAMP   NULLABLE                    %Y-%m-%d %H:%M:%E*S
item_id         STRING      NULLABLE        
order_quantity  INTEGER     NULLABLE    

客户可以在一个日期下多个订单。 我正在尝试编写一个查询,为每个客户在他们下订单的每个日期对 order_id 进行排名:

SELECT customer_id,
order_datetime as order_date,
order_id,
RANK() OVER(PARTITION BY customer_id, CAST(order_datetime AS DATETIME) ORDER BY 2 DESC) as rank
FROM `SQL_sets.orders`

返回以下内容:

customer_id     order_date      order_id    rank
21456       2019-01-12 9:28:35      A-005   1
21456       2019-01-12 12:28:35     A-005   1
21456       2019-01-12 19:28:35     A-005   1
31874       2020-11-15 0:00:00      A-009   1
32483       2020-11-21 0:00:00      A-001   1
32483       2020-11-22 0:00:00      A-001   1
42491       2019-01-16 2:52:07      A-006   1
42491       2019-01-20 2:52:07      A-0101  1
42491       2019-12-01 9:52:07      A-007   1
42491       2019-12-01 15:12:07     A-008   1
42491       2020-11-19 0:00:00      A-006   1
55400       2019-01-11 12:52:07     A-0088  1

但我期望/想要得到:

customer_id     order_date      order_id    rank
21456       2019-01-12 9:28:35      A-005   1
21456       2019-01-12 12:28:35     A-005   2
21456       2019-01-12 19:28:35     A-005   3
31874       2020-11-15 0:00:00      A-009   1
32483       2020-11-21 0:00:00      A-001   1
32483       2020-11-22 0:00:00      A-001   1
42491       2019-01-16 2:52:07      A-006   1
42491       2019-01-20 2:52:07      A-0101  1
42491       2019-12-01 9:52:07      A-007   1
42491       2019-12-01 15:12:07     A-008   2
42491       2020-11-19 0:00:00      A-006   1
55400       2019-01-11 12:52:07     A-0088  1

我做错了什么?

【问题讨论】:

    标签: google-bigquery ranking-functions


    【解决方案1】:

    您没有说,但我假设您使用的是 SQL 服务器。这可能更多的是你想要什么。在您的示例中,您的分区是按客户和日期时间划分的,因此除非客户同时订购两件东西,否则排名将始终为 1。如果您只对同一日期发生的订单感兴趣,则需要将其转换为那种……

    SELECT customer_id,
    order_datetime as order_date,
    order_id,
    RANK() OVER(PARTITION BY customer_id ORDER BY CAST(order_datetime AS DATETIME) DESC) rank
    FROM `SQL_sets.orders`
    

    【讨论】:

    • 感谢您指出我的错误。我将其修复为 RANK() OVER(PARTITION BY customer_id, CAST(order_datetime AS DATE) ORDER BY CAST(order_datetime AS DATETIME) ASC) 作为排名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2013-08-06
    • 2022-12-02
    相关资源
    最近更新 更多