【问题标题】:How to use select a greater order when datetime is the same?当日期时间相同时如何使用选择更大的顺序?
【发布时间】:2022-01-12 19:10:58
【问题描述】:

我有一张桌子:

CREATE TABLE TBL_A
(
    number_id int, 
    country varchar(50), 
    status varchar(50), 
    datetime date
);

INSERT INTO TBL_A
VALUES (121144, 'USA', 'CLICKED', '2021-10-09'),
       (121144, 'USA', 'CLAIMED', '2021-10-10'),
       (121144, 'USA', 'BOUGHT', '2021-10-11'),
       (121111, 'CAD', 'CLICKED', '2021-10-12'),
       (121111, 'CAD', 'CLAIMED', '2021-10-12'),
       (121111, 'CAD', 'BOUGHT', '2021-10-12'),
       (121133, 'AUS', 'CLICKED', '2021-10-14'),
       (121133, 'AUS', 'CLAIMED', '2021-10-14');

基于 number_id 和国家,我想根据日期时间获取最后状态。我遇到的问题是日期时间具有相同的值。发生这种情况时,我希望最后一个状态遵循此顺序:

> BOUGHT > CLAIMED > CLICKED

因此,如果购买、认领和点击的日期时间相同,则应选择已购买。如果没有购买和认领并点击,则应选择 CLAIMED 的日期时间。

我有这个查询来选择 LAST 状态,但是当日期时间相同时,我需要它来考虑顺序:

SELECT    
    NUMBER_ID,
    COUNTRY,
    (array_agg(STATUS) WITHIN GROUP (ORDER BY DATETIME DESC)[0])::varchar AS LAST_STATUS
FROM
    TBL_A
GROUP BY 
    1, 2

【问题讨论】:

    标签: sql snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    使用DECODE 添加额外的列排序以防出现平局:

    SELECT NUMBER_ID, COUNTRY
        ,(array_agg(STATUS) within group(order by DATETIME desc, 
                            DECODE(status, 'BOUGHT',1,'CLAIMED',2,'CLICKED',3, 99)
         )[0])::varchar as LAST_STATUS
    from TBL_A
    GROUP BY NUMBER_ID, COUNTRY;
    

    【讨论】:

    • 这行得通!谢谢你:)
    猜你喜欢
    • 2019-07-14
    • 2020-03-02
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2016-08-23
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多