如何在日期时间相同的情况下使用 select 更大的顺序?
How to use select a greater order when datetime is the same?
我有一个 table:
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
因此,如果购买、领取和点击具有相同的日期时间,则应该 select 购买。如果没有购买、认领和点击,则日期时间应该 select 认领。
我有此查询 select 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
使用 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;
我有一个 table:
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
因此,如果购买、领取和点击具有相同的日期时间,则应该 select 购买。如果没有购买、认领和点击,则日期时间应该 select 认领。
我有此查询 select 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
使用 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;