SQL中的最后5行(带条件)

我有一张桌子,上面有购买信息。它包含自2010年以来宠物店的所有购买信息。我以这种方式带来了最后5行,然后仅将最后一次购买保存在另一个表中:

SELECT *
FROM (
    SELECT 
        client_name,purchase_date,item,payment,ROW_NUMber() OVER(PARTITION BY client_name ORDER BY purchase_date desc) rn
    FROM Pet_Shop
   ) x
WHERE rn <= 5
ORDER BY client_name

哪个带给我

client_name | purchase_date | item | payment
_____________________________________________
John        | 2019-09-14    | food | cash
John        | 2019-09-13    | ball | cash  
John        | 2019-09-12    | shampoo| cash
John        | 2019-09-11    | cookie| cash 
John        | 2019-09-11    | food  | cash
Mary        | 2019-09-14    | collar| cash
Mary        | 2019-07-14    | food  | cash
Mary        | 2019-06-14    | toy   | credit card
Mary        | 2019-06-14    | hamster | cash
Mary        | 2019-05-14    | food  | cash 
Austin      | 2019-09-18    | food  | cash
Austin      | 2019-09-11    | collar| cash
Austin      | 2019-09-10    | toy   | cash
Austin      | 2019-09-09    | catnip| cash
Austin      | 2019-09-11    | food  | cash

但是,我很难删除使用信用卡购买的客户。也就是说,如果客户在任何时候最近五次使用信用卡支付的商品中都不应列出。我尝试过类似WHERE payment like not '%card%'的操作,但这意味着仅未出现卡注册,而随后的卡却出现了。

jyws8 回答:SQL中的最后5行(带条件)

将子查询包装在CTE中,并使用NOT EXISTS:

WITH cte AS (
    SELECT 
        client_name,purchase_date,item,payment,ROW_NUMBER() OVER(PARTITION BY client_name ORDER BY purchase_date desc) rn
    FROM Pet_Shop
)
SELECT c.*
FROM cte c
WHERE c.rn <= 5
AND NOT EXISTS (
  SELECT 1 FROM cte
  WHERE client_name = c.client_name AND payment LIKE '%card%'
)
ORDER BY c.client_name
本文链接:https://www.f2er.com/3078450.html

大家都在问