簡體   English   中英

使用 rank 命令限制查找上次購買

[英]Use rank command to limit find last purchase

我試圖找到每個 customer_id 的最后一次購買。 由於有 3 位客戶,我希望返回 3 行,但我得到了更多。

有人可以告訴我出了什么問題以及如何解決這個問題。 任何幫助將不勝感激


ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY  HH24:MI:SS.FF';

 ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';


CREATE TABLE customers 
(CUSTOMER_ID, FIRST_NAME, LAST_NAME) AS
SELECT 1, 'Faith', 'Mazzarone' FROM DUAL UNION ALL
SELECT 2, 'Lisa', 'Saladino' FROM DUAL UNION ALL
SELECT 3, 'Jerry', 'Torchiano' FROM DUAL;

CREATE TABLE items 
(PRODUCT_ID, PRODUCT_NAME) AS
SELECT 100, 'Black Shoes' FROM DUAL UNION ALL
SELECT 101, 'Brown Shoes' FROM DUAL UNION ALL
SELECT 102, 'White Shoes' FROM DUAL;

CREATE TABLE purchases
(CUSTOMER_ID, PRODUCT_ID, QUANTITY, PURCHASE_DATE) AS
SELECT 1, 100, 1, TIMESTAMP'2022-10-11 09:54:48' FROM DUAL UNION ALL
SELECT 1, 100, 1, TIMESTAMP '2022-10-11 19:04:18' FROM DUAL UNION ALL
SELECT 2, 101,1, TIMESTAMP '2022-10-11 09:54:48' FROM DUAL UNION ALL
SELECT 2,101,1, TIMESTAMP '2022-10-17 19:04:18' FROM DUAL UNION ALL
SELECT 3, 101,1, TIMESTAMP '2022-10-11 09:54:48' FROM DUAL UNION ALL
SELECT 3,102,1, TIMESTAMP '2022-10-17 19:04:18' FROM DUAL UNION ALL
SELECT 3,102, 4,TIMESTAMP '2022-10-10 17:00:00' + NUMTODSINTERVAL ( LEVEL * 2, 'DAY') FROM    dual
CONNECT BY  LEVEL <= 5;

with cte as
     (select 
        CUSTOMER_ID, 
        PRODUCT_ID, 
        QUANTITY, 
        PURCHASE_DATE,
        rank() over (partition by customer_id order by purchase_date desc) rnk
      from purchases
     )
       SELECT p.customer_id,
                c.first_name,
                c.last_name,
                p.product_id,
                i.product_name,
                p.quantity, 
                p.purchase_date   
    from cte p   
 JOIN customers c ON c.customer_id = p.customer_id
                   JOIN items i ON i.product_id = p.product_id 
   where rnk = 1:
        

首先,不要使用 RANK 或 DENSE_RANK - 它們將分配具有相同等級的相同 purchase_date 值,因此給你多個“1”值。 請改用 ROW_NUMBER。

其次,你有兩次“from cte p”。 刪除第二個。

最后,您問題的真正答案是您在“where rank = 1”之前有一個分號,因此在執行分號之后沒有任何內容。 因此它不是過濾。 分號完全結束 SQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM