2016-07-15 161 views
-1

我想我可能会反思这一点,但是我在尝试通过Oracle数据库中的多个连接以及几个where子句找到最大日期时遇到问题。我发现了很多简单的最大查询的例子,但没有特别的例子。查询工作正常,如果我添加一行来查找特定日期之上的所有记录(只返回少数结果)。但是,我想自动从帐单表中获取所有记录的最新日期。这个数据库有一个额外的表格,其中存储了实际帐单数量,因此增加了另一个层次。Oracle SQL - 通过多个连接获取Max Date

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 ...); 

我已经尝试在他们的最大功能做子查询,但我没有任何运气。每个查询返回与原始查询相同数量的记录。我将如何重新安排这个查询来检索所有必要的列和where子句,同时还将此限制为仅最近一次收费的购买行为?

+2

发布一些样本数据+预期结果总是有帮助的。 – sstan

+0

'从yourtable'选择max(datefield)? –

+0

你有没有尝试类似于:SELECT p.purchase_id,p.account_id,MAX(b.bill_date),bp.current_amount ... ... body ... ... GROUP BY SELECT p.purchase_id,p.account_id, bp.current_amount –

回答

0

我在发布后几乎找到了这个工作,这是我的一个愚蠢的错误。最大函数的数据需要在account_id上加入,而不是bill_id。

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 ...); 
+0

一个很好的建议,但我曾尝试过。返回与执行没有max函数的查询相同数量的结果。无法弄清楚原因。 –

+0

发布样本数据。没有你的数据,难以发布查询 –

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 ...); 
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;