Oracle SQL - 通过多个连接获取最大日期

时间:2016-07-15 18:53:55

标签: sql oracle max

我想我可能会过度思考这个问题,但是在尝试查找Oracle数据库中的多个连接的最大日期以及几个where子句时,我遇到了问题。我发现了许多简单的最大查询的例子,但没有特别喜欢这个。如果我添加一行来查找特定日期之上的所有记录(只返回少量结果),查询工作正常。但是,我想自动从bill表中获取所有记录的最新日期。该数据库有一个附加表,其中存储了实际的账单金额,因此添加了另一个图层。

SELECT p.purchase_id, p.account_id, b.bill_date, bp.current_amount 
FROM Purchases p
JOIN Bill_Purchases bp ON p.purchase_id = bp.purchase_id
JOIN Bills b ON bp.bill_id = b.bill_id
--NEED TO GET MOST RECENT DATE FROM BILL TABLE FOR EACH BILL
WHERE p.type != 'CASH'
AND bp.amount > '100.00' 
AND p.status = 'Approved'
AND p.purchase_id IN ( ... list of purchases ...);

我已经尝试过使用Max函数进行子查询,但是没有运气。每个查询返回与原始查询相同数量的记录。我如何重新排列此查询以仍然检索所有必要的列和where子句,同时仍将此限制仅限于最近的结算购买?

4 个答案:

答案 0 :(得分:1)

尝试下面这个

SELECT p.purchase_id, p.account_id, b.bill_date, bp.current_amount 
FROM Purchases p
JOIN Bill_Purchases bp ON p.purchase_id = bp.purchase_id
JOIN (  SELECT bill_id, MAX(bill_date) bill_date
        FROM Bills 
        GROUP BY bill_id
     )b ON bp.bill_id = b.bill_id
WHERE p.type != 'CASH'
AND bp.amount > '100.00' 
AND p.status = 'Approved'
AND p.purchase_id IN ( ... list of purchases ...);

答案 1 :(得分:0)

您可能希望使用Rank()函数

来解决此问题
SELECT p.purchase_id, p.account_id, , bp.current_amount, RANK() OVER ( partition by b.bill_id order by b.bill_date) as max_bill_date 
FROM Purchases p
JOIN Bill_Purchases bp ON p.purchase_id = bp.purchase_id
JOIN Bills b ON bp.bill_id = b.bill_id
--NEED TO GET MOST RECENT DATE FROM BILL TABLE FOR EACH BILL
WHERE max_bill_date = 1
AND p.type != 'CASH'
AND bp.amount > '100.00' 
AND p.status = 'Approved'`enter code here`
AND p.purchase_id IN ( ... list of purchases ...);

答案 2 :(得分:0)

这些中的任何一个都适合你吗?

WITH data as (
    SELECT
        p.purchase_id, p.account_id, b.bill_date, bp.current_amount,
    FROM
        Purchases p
        INNER JOIN Bill_Purchases bp ON p.purchase_id = bp.purchase_id
        INNER JOIN Bills b ON b.bill_id = bp.bill_id
    WHERE p.type <> 'CASH'
    AND bp.amount > '100.00' 
    AND p.status = 'Approved'
    AND p.purchase_id IN ( ... list of purchases ...)
), most_recent as  (
    SELECT max(bill_date) as bill_date FROM data
)
SELECT *
FROM data
WHERE bill_date = (select bill_date from most_recent);


SELECT purchase_id, account_id, bill_date, current_amount
FROM (
    SELECT
        p.purchase_id, p.account_id, b.bill_date, bp.current_amount,
        dense_rank() over (order by b.bill_date desc) as dr
    FROM
        Purchases p
        INNER JOIN Bill_Purchases bp ON p.purchase_id = bp.purchase_id
        INNER JOIN Bills b ON b.bill_id = bp.bill_id
    WHERE p.type <> 'CASH'
    AND bp.amount > '100.00' 
    AND p.status = 'Approved'
    AND p.purchase_id IN ( ... list of purchases ...)
) data
WHERE dr = 1;

答案 3 :(得分:0)

我在发帖后非常正确地工作,这对我来说是一个愚蠢的错误。需要在account_id上加入max函数的数据,而不是bill_id。