2011-07-27 19 views
0

我有一個最大的n-per-group問題,我試圖解決。我一直在閱讀現有的解決方案,但沒有一個看起來與我正在處理的怪癖相匹配。SQL最大的n-per-group與多個表上的斑點數據

場景:比方說,有一家石油公司,它有一個油井收集。每口井都有許多油罐。每天都有人讀每口井。有時他們也讀取坦克的讀數,但坦克讀數不太頻繁,可能會分散數天。

所有井和水箱的讀數都記錄到數據庫中,按日期組織。

CREATE TABLE "wellReadings" (
    "id" INT PRIMARY AUTO_INCREMENT, 
    "date" DATETIME, 
    "wellName" VARCHAR(10), 
    ... 
); 

CREATE TABLE "tankReadings" (
    "id" INT PRIMARY AUTO_INCREMENT, 
    "date" DATETIME, 
    "well" INT NOT NULL, 
    "tankName" VARCHAR(10), 
    ... 
); 

問題:對於任何給定以及讀取(在wellReadings表)在任何給定的日期,我想找到油箱的讀數(在tankReadings表)所有與井相關的坦克,在同一天採取。如果某個特定的坦克在當天沒有閱讀,我希望在該日期之前閱讀最近的閱讀材料。

到目前爲止,我一直在嘗試使用連接和subquerys,但一直無法將結果縮小到最近的坦克讀數(我的測試查詢不斷給我所有發生在或之前的坦克讀數良好的閱讀日​​期)。相關的子查詢可能有效,但我的數據庫不支持它們(SQLite)。

+0

我不太看tankReadings如何與給您所提供的列wellReadings。 – Neil

回答

1

你總是可以嘗試類似:

SELECT * FROM wellReadings AS well, tankReadings AS tank 
WHERE tank.well = well.id 
    AND tank.date = 
     (SELECT MAX(tank2.date) FROM tankReadings AS tank2 
     WHERE tank2.id = tank.id 
      AND tank2.date <= well.date) 

這可能不是做最有效的方式,但它應該工作。

Ps。如果有可能,有些井可能完全沒有過去的坦克讀數,您可能需要使用一個左連接,而不是:

SELECT * FROM wellReadings AS well 
    LEFT JOIN tankReadings AS tank 
    ON tank.well = well.id 
    AND tank.date = 
     (SELECT MAX(tank2.date) FROM tankReadings AS tank2 
     WHERE tank2.id = tank.id 
      AND tank2.date <= well.date) 
+0

哎呀,在我的第一個答案中,我認爲每個水箱有多個水井,而不是相反。糾正。 –