[英]Joining results of two different aggregate functions on the same table
我正在嘗試組合兩個查詢,以便確定在特定時間(2011-09-19 04:00:00.000)之前哪個飛機將在特定點(點ABCD)。 到目前為止,我生成了最后一架飛機到達這一點,以及飛機最后一次離開該點。 我目前的想法是,如果它最后一次到達的時間大於它最后一次離開飛機仍然在指定時間之前的ABCD點。
第一個查詢查找飛機最后一次到達某個點:
select aircraft_id, MAX(arrival_datetime) as last_arrival
from flight_schedule
where arrival_datetime < '2011-09-19 04:00:00.000' and arrival_point='ABCD'
group by aircraft_id
第二個查詢找到飛機最后一次離開這一點:
select aircraft_id, MAX(departure_datetime) as last_departure
from flight_schedule
where departure_datetime < '2011-09-19 04:00:00.000' and departure_point='ABCD'
group by aircraft_id
這兩個查詢都會生成相應的響應。 我意識到為了比較last_departure和last_arrival字段,我需要以某種方式加入表。
我不是一個SQL專家,在過去任何表連接我已經完成了兩個完全不同的表之間並沒有涉及任何聚合函數所以我的正常子查詢和結構沒有工作。
select la.aircraft_id, la.last_arrival, ld.last_departure
from (
select aircraft_id, MAX(arrival_datetime) as last_arrival
from flight_schedule
where arrival_datetime < '2011-09-19 04:00:00.000' and arrival_point='ABCD'
group by aircraft_id
) la
full outer join (
select aircraft_id, MAX(departure_datetime) as last_departure
from flight_schedule
where departure_datetime < '2011-09-19 04:00:00.000' and departure_point='ABCD'
group by aircraft_id
) ld on ld.aircraft_id = la.aircraft_id
請注意,我使用了full outer join
。 inner join
聯接很可能就足夠了。 該full outer join
是否有過一個只需要arival_datetime
沒有departure_datetime
,反之亦然(至極是不太可能發生)。
嘗試這樣:
select dpt.aircraft_id, last_arrival, last_departure
from
(
select aircraft_id, MAX(arrival_datetime) as last_arrival
from flight_schedule
where arrival_datetime < '2011-09-19 04:00:00.000' and arrival_point='ABCD'
group by aircraft_id
) dpt
inner join
(
select aircraft_id, MAX(departure_datetime) as last_departure
from flight_schedule
where departure_datetime < '2011-09-19 04:00:00.000' and departure_point='ABCD'
group by aircraft_id
) arr on dpt.aircraft_id = arr.aircraft_id
以下解決方案使用標准SQL,並且應該在大多數(如果不是全部)主要RDBMS中工作:
SELECT
aircraft_id,
CASE
WHEN MAX(CASE arrival_point WHEN 'ABCD' THEN arrival_datetime END) >
MAX(CASE departure_point WHEN 'ABCD' THEN departure_datetime END)
THEN 'At the point'
ELSE 'Somwhere else'
END AS is_located
FROM flight_schedule
WHERE arrival_datetime < '2011-09-19 04:00:00.000' AND arrival_point = 'ABCD'
OR departure_datetime < '2011-09-19 04:00:00.000' AND departure_point = 'ABCD'
GROUP BY
aircraft_id
如果您的特定RDBMS支持CTE和排名函數,您還可以嘗試不同的方法:
WITH events AS (
SELECT
aircraft_id,
arrival_datetime AS event_datetime,
'At the point' AS is_located
FROM flight_schedule
WHERE arrival_datetime < '2011-09-19 04:00:00.000'
AND arrival_point = 'ABCD'
UNION ALL
SELECT
aircraft_id,
departure_datetime AS event_datetime,
'Somewhere else' AS is_located
FROM flight_schedule
WHERE departure_datetime < '2011-09-19 04:00:00.000'
AND departure_point = 'ABCD'
),
ranked AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY aircraft_id
ORDER BY event_datetime DESC
) AS event_rank
FROM events
)
SELECT
aircraft_id,
is_located
FROM ranked
WHERE event_rank = 1
非常感謝。 我已經工作了10個小時,為期兩天。
總之,主查詢包裝任意數量的子查詢,並通過使用別名命名子查詢,您可以將數據從子查詢推送到主查詢:
SELECT N.Name_CO_ID, N.Name_Company, N.District_Count, D.DistrictName, D.District_Response
FROM (
SELECT Name_CO_ID, Name_Company, COUNT(dbo.SV_Name.Name_CO_ID) AS 'District_Count'
FROM SV_Name
JOIN dbo.SV_Activity ON dbo.SV_Name.Name_ID = dbo.SV_Activity.Activity_ID
JOIN dbo.SV_Product ON dbo.SV_Activity.Activity_PRODUCT_CODE = dbo.SV_Product.Product_PRODUCT_CODE
AND (dbo.SV_Activity.Activity_ACTIVITY_TYPE = 'COMMITTEE')
AND (dbo.SV_Product.Product_GROUP_3 = 'DIST')
AND (dbo.SV_Activity.Activity_THRU_DATE > GETDATE())
AND (dbo.SV_Name.Name_CO_MEMBER_TYPE = 'LSD')
GROUP BY Name_CO_ID, Name_Company) N
FULL OUTER JOIN (SELECT DistrictName, COUNT(DistrictName)AS 'District_Response'
FROM ODS_Landing
WHERE (StartDate > @StartDate1) AND (StartDate < @StartDate2)
GROUP BY DistrictName) D ON N.Name_COMPANY = D.DistrictName
WHERE District_Response > 0
ORDER BY Name_Company
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.