2011-01-23 72 views
1

我有兩個不同的表來跟蹤設備的位置。 「設備」表跟蹤當前位置以及它在何處安裝。如果設備之前位於不同的位置,則該信息保存在「locationHistory」表中。設備表中每equip_id有一行。 locationHistory表中每個equip_id可以有0個或多個條目。SQL得到兩個不同的字段的最小值

equipment 
    equip_id 
    current_location 
    install_date_at_location 

locationHistory 
    equip_id 
    location 
    install_date 
    pickup_date 

我想要一個SQL查詢,得到每件eqipment第一INSTALL_DATE日期...

例子:

equipment 
========= 
equip_id | current_location | install_date_at_location 
    123 location1   1/23/2011 

locationHistory 
=============== 
equip_id | location | install_date | pickup_date 
    123 location2 1/1/2011  1/5/2011 
    123 location3 1/7/2011  1/20/2011 

應返回:123, 1/1/2011

思考?

+0

對於什麼數據庫? – 2011-01-23 21:28:51

回答

1

你會想要結合每個查看一個字段的查詢,然後對它使用MIN。 或者你可以使用CASE和MIN達到相同的效果

select e.equip_id, MIN(CASE WHEN h.install_date < e.install_date_at_location 
    THEN h.install_date 
    ELSE e.install_date_at_location 
END) as first_install_date 
from equipment e 
left join locationHistory h on h.equip_id = e.equip_id 
group by e.equip_id 
0

好,信息的關鍵部分是在設備install_at_location_date是否能永遠會小於我以爲是在locationHistory歷史信息。如果這是不可能的,你可以這樣做:

SELECT * FROM locationHistory L INNER JOIN 
    (SELECT equip_id, MIN(install_date) AS firstDate FROM locationHistory) 
    AS firstInstalls F 
    ON L.equip_id = F.equip_id AND L.install_date = F.firstDate 

但如果你擔心這兩個表,您需要創建觀點,即標準化的表給你,然後應用查詢反對觀點:

CREATE VIEW normalLocations (equip_id, location, install_date) AS 
    SELECT equip_id, location, install_date_at_location FROM equipment 
    UNION ALL 
    SELECT equip_id, location, install_date FROM equipment; 

SELECT * FROM normalLocations L INNER JOIN 
    (SELECT equip_id, MIN(install_date) AS firstDate FROM normalLocations) 
     AS firstInstalls F 
    ON L.equip_id = F.equip_id AND L.install_date = F.firstDate 
0

一個簡單的方法來做到這一點是:

SELECT U.Equip_ID, MIN(U.Install_Date) 
    FROM (SELECT E.Equip_ID, E.Install_Date_At_Location AS Install_Date 
      FROM Equipment AS E 
     UNION 
     SELECT L.Equip_ID, L.Install_Date 
      FROM LocationHistory AS L 
     ) AS U 
GROUP BY U.Equip_ID 

這會產生大量從LocationHistory表中的行,但目前尚不清楚,這是值得嘗試應用「優化」呢GROUP BY和MIN分配給UNION的後半部分(因爲您立即使用設備表中的信息重做分組)。

相關問題