【问题标题】:What query should be written for this?应该为此编写什么查询?
【发布时间】:2015-08-07 13:04:42
【问题描述】:

您好,我有一张银行客户的交易表。表的名称是 CUST_TRANSACTION。它有几个字段,如 CUST_ID、TRANSACTION_DATE 等。我想编写一个查询,以便我可以选择 3 个特定客户 ID 的最后一笔交易。比如

TRANSACTION_ID | CUST_ID | TRANSACTION_DATE | TRANSACTION_DESC

100023 | 2 | 15-12-2014 06:00 | Withdraw 1000 dollars
100022 | 5 | 14-12-2014 16:00 | Deposit 1000 dollars 
100021 | 5 | 14-12-2014 15:00 | Withdraw 500 dollars
100020 | 4 | 12-12-2014 15:00 | Withdraw 300 dollars
100019 | 4 | 12-12-2014 14:39 | Deposit 300 dollars
100018 | 2 | 12-12-2014 15:00 | Withdraw 60 dollars

我想获取 id 2、4、5 的最后一笔交易

TRANSACTION_ID | CUST_ID | TRANSACTION_DATE | TRANSACTION_DESC

100023 | 2 | 15-12-2014 06:00 | Withdraw 1000 dollars
100022 | 5 | 14-12-2014 16:00 | Deposit 1000 dollars
100020 | 4 | 12-12-2014 15:00 | Withdraw 300 dollars

我应该如何处理它?

编辑:到目前为止我已经尝试过这个

select * 
from CUST_TRANSACTION 
where CUST_ID IN('2', '5', '4') 
and rownum <4 
order by transaction_date desc 

【问题讨论】:

  • 你的尝试在哪里?听起来您希望我们为您完成工作。听起来很像一个家庭作业问题。根据Help Center“请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。”
  • @mason 感谢您的指出。

标签: sql oracle greatest-n-per-group


【解决方案1】:

使用 rank() 获取顶部项目,然后只为每个项目选择排名靠前的行。例如:

SELECT *
FROM (
  select 
    transaction_id,
    cust_id,
    transaction_date,
    transaction_desc,
    rank() OVER (PARTITION BY cust_id ORDER BY cust_id, transaction_date desc) AS rank_id
  from cust_transaction
  ) ct
WHERE ct.rank_id = 1

SQL Fiddle

【讨论】:

  • 非常感谢。我被困了很长时间。你救了我。
【解决方案2】:

你应该试试这个

SELECT CUST_ID , a.TRANSACTION_ID, TRANSACTION_DATE , TRANSACTION_DESC from CUST_TRANSACTION AS a
INNER JOIN (SELECT MAX(TRANSACTION_ID) TRANSACTION_ID FROM CUST_TRANSACTION GROUP BY CUST_ID) AS b ON a.TRANSACTION_ID=b.TRANSACTION_ID

【讨论】:

    【解决方案3】:

    试试这个

    select t1.TRANSACTION_ID , 
    t1.CUST_ID ,t1.TRANSACTION_DATE ,t1.TRANSACTION_DESC from table t1 
    inner join
    (
    select CUST_ID ,min(TRANSACTION_DATE) as  TRANSACTION_DATE from table
    group by CUST_ID
    ) t2
    on t1.CUST_ID=t2.CUST_ID and t1.TRANSACTION_DATE =t2.TRANSACTION_DATE 
    

    【讨论】:

      【解决方案4】:

      按客户 ID 分组并获取 max(transaction_date)。使用此客户 id 和 transaction_date 组合获取记录

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 2011-10-30
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多