2011-01-23 122 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的后半部分(因为您立即使用设备表中的信息重做分组)。

相关问题