2014-11-17 37 views
0

這可能是非常簡單的事情,但我在這個聲明上工作了將近一天,而且我無法通過某種方式獲得。選擇具有最大值的行加入

我想要做的是爲每個存儲位置獲取具有最年輕日期的匹配配售商。

STORAGEPLACE( ID, STORAGE_ZONE, 值a)

PARCELORDER (ID, SHELF, ENDTIME, VALUEB)

Storagezone和貨架都來自相同類型的。

可以有多個匹配的存儲空間和多個配件,這就是爲什麼我需要最小的值。

VALUEA和VALUEB只是附加值。

SELECT p1.NAME, t1.ID, t1.ENDTIME 
    FROM STORAGE_PLACE p1 
    LEFT JOIN PARCELORDER t1 
    ON p1.STORAGE_ZONE=t1.SHELF 
    INNER JOIN(SELECT ta.ID, MIN(ta.ENDTIME) as mindate 
       from PARCELORDER ta 
       GROUP BY ta.ID) tb 
    ON tb.ID = t1.ID and tb.mindate = t1.ENDTIME 
    WHERE p1.VALUEA = 0 AND t1.VALUEB = -1 

我試了好聯接,(自然,左,內...)這storage_places和parcelorders的多種組合的所有結果。

我已經嘗試過是

SELECT p1.NAME, t1.ID, t1.ENDTIME 
    FROM STORAGE_PLACE p1 
    LEFT JOIN PARCELORDER t1 
    ON p1.STORAGE_ZONE=t1.SHELF 
    INNER JOIN(SELECT DISTINCT(ta.ID), MIN(ta.ENDTIME) as mindate 
       from PARCELORDER ta 
       GROUP BY ta.ID) tb 
    ON tb.ID = t1.ID and tb.mindate = t1.ENDTIME 
    WHERE p1.VALUEA = 0 AND t1.VALUEB = -1 

SELECT p1.NAME, t1.ID, t1.ENDTIME 
    FROM STORAGE_PLACE p1 
    LEFT JOIN PARCELORDER t1 
    ON p1.STORAGE_ZONE=t1.SHELF 
    INNER JOIN(SELECT FIRST 1 ta.ID, MIN(ta.ENDTIME) as mindate 
       from PARCELORDER ta 
       GROUP BY ta.ID) tb 
    ON tb.ID = t1.ID and tb.mindate = t1.ENDTIME 
    WHERE p1.VALUEA = 0 AND t1.VALUEB = -1 

和它們的幾種組合,但這些只給回第一parcelorder的所有組合。

我使用的是較舊的firebird,所以在SELECT ONE Row with the MAX() value on a column中某處所述的row_number()方法將無法工作。

回答

2

看着你的模式,我猜這是與STELAGE_PLACE中的STORAGE_ZONE的外鍵PARCELORDER中的SHELF的一對多關係。你的查詢是在PARCELORDER的ID上進行分組,我猜測它是表上的主鍵,所以你仍然可以得到表中每條記錄的一條記錄。

您想要做的是按SHELF分組,因此每個SHELF只能獲得一條記錄。

嘗試此查詢:

SELECT p1.NAME, t1.ID, t1.ENDTIME 
    FROM STORAGE_PLACE p1 
    INNER JOIN(SELECT ta.SHELF, MIN(ta.ENDTIME) as mindate 
       from PARCELORDER ta 
       GROUP BY ta.SHELF) tb 
    ON p1.STORAGE_ZONE=t1.SHELF 
    INNER JOIN PARCELORDER t1 ON t1.ENDTIME = tb.mindate AND t1.SHELF = tb.SHELF 
WHERE p1.VALUEA = 0 AND t1.VALUEB = -1 

這應該爲你工作,假設只有一個在PARCELORDER記錄對於給定的貨架時間和結束時間。否則,您可能必須創建一個臨時表,其中包含給定SHELF的最小ENDTIME記錄的ID。

+0

我剛剛更新了我的問題。 不,有可能有多個伴隨着給定貨架和結束時間的伴侶 – confusedandtired

0

我很難分辨這兩個表是如何相關的,因爲除了在查詢中沒有工作,您沒有提供這些信息,因此我們試圖從您的查詢中解密的關係可能不正確以及。這就是說,請嘗試下面的內容。如果它不工作,我需要知道如何在兩個表中的行相關的詳細信息,最好用樣本數據:

with CTE_MIN_TIME_PER_SHELF as (
    select SHELF, min(ENDTIME) as MIN_ENDTIME 
    from  PARCELORDER 
    group by SHELF 
) 
select  p1.NAME, t1.ID, c.MIN_ENDTIME 
from  STORAGE_PLACE p1 
left join CTE_MIN_TIME_PER_SHELF c 
     on c.SHELF = p1.STORAGE_ZONE 
left join PARCELORDER t1 
     on t1.SHELF = c.SHELF 
     and t1.ENDTIME = c.MIN_ENDTIME 

我看不出值a和valueB來自何方爲這部分。這是一個火鳥的事情嗎?:

WHERE p1.VALUEA = 0 AND t1.VALUEB= -1 
+0

'VALUEA'和'VALUEB'可能是正常的列(來自'STORAGE_PLACE'和'PARCELORDER')。這絕對是來自Firebird本身的東西。 –