2016-07-15 103 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;