簡體   English   中英

從SQL表獲取值

[英]Get Values From SQL Table

我有看起來像這樣的表:

FlightLeg

+------+-----+-------+------+---------------------+---------------------+-------+
| FLNO | Seq | FromA | ToA  | DeptTime            | ArrTime             | Plane |
+------+-----+-------+------+---------------------+---------------------+-------+
| 1000 |   1 | DFW   | LOG  | 2020-01-01 01:10:20 | 2020-01-01 01:13:40 |     7 |
| 1010 |   1 | LAX   | ORD  | 2020-01-01 01:13:10 | 2020-01-01 01:16:20 |     3 |
| 1020 |   1 | LOG   | JFK  | 2020-01-01 01:05:40 | 2020-01-01 01:06:20 |     9 |
| 1030 |   1 | LAX   | INT  | 2020-01-01 01:11:20 | 2020-01-01 01:16:10 |     6 |
| 1040 |   1 | LAX   | LGA  | 2020-02-01 01:15:30 | 2020-01-01 01:21:00 |     1 |
| 1010 |   2 | ORD   | JFK  | 2020-01-01 01:17:10 | 2020-01-01 01:20:20 |     3 |
| 1020 |   2 | JFK   | DFW  | 2020-01-01 01:07:20 | 2020-01-01 01:10:20 |     9 |
| 1030 |   2 | INT   | DFW  | 2020-01-01 01:17:20 | 2020-01-01 01:18:00 |     6 |
| 1020 |   3 | DFW   | INT  | 2020-01-01 01:11:10 | 2020-01-01 01:11:40 |     7 |
| 1020 |   4 | INT   | LAX  | 2020-01-01 01:12:20 | 2020-01-01 01:15:10 |     7 |
+------+-----+-------+------+---------------------+---------------------+-------+

和這個:

飛行

+------+--------+---------+
| FLNO | Meal   | Smoking |
+------+--------+---------+
| 1000 | Bistro | Y       |
| 1010 | Meal   | N       |
| 1020 | Meal   | Y       |
| 1030 | Snack  | N       |
| 1040 | Meal   | N       |
+------+--------+---------+

我正在嘗試編寫一個查詢,在該查詢中,對於具有兩條以上航程的每個航班,檢索航班號(FLNO),首個出發城市(FromA)和最終到達的城市。 飛行序列可以以任意整數開始,並且可以由任意整數偏移量分隔。

這是我到目前為止的內容:

SELECT FlightLeg.FLNO, (
SELECT FlightLeg.FromA
FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2),
(
SELECT FlightLeg.ToA
FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2)

FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2;

我只能輸出正確飛行的第一個序列的FLNO,FromA和ToA。

預期產量:

+------+-------+------+
| FLNO | FromA | ToA  |
+------+-------+------+
| 1020 | LOG   | LAX  |
+------+-------+------+

我想我真的很接近,但是我不確定如何為最小的序列找到FromA,為最大的序列找到ToA。

有人可以幫忙嗎? 謝謝!

解決此問題的一種方法是使用自聯接和派生表,如下所示:

select flight_start.flno, flight_start.froma, flight_end.toa 
from flightleg flight_start
join flightleg flight_end on flight_start.flno = flight_end.flno
join (
  select 
    flno,
    min(seq) origin,
    max(seq) destination
  from flightleg
  group by flno
  having count(*) > 2
) min_max_seq
 on flight_start.flno = min_max_seq.flno 
and flight_start.seq  = min_max_seq.origin
and flight_end.seq    = min_max_seq.destination

用作派生表的查詢確定每個航班的最低和最高序號,並且第一個聯接使用較低的序號檢索始發機場,而第二個聯接使用較高的序號檢索目的機場。 支路的數量在派生表的having子句中確定。

附帶一提:如果序列號不是訂單的良好決定因素,則可以使用日期來確定訂單或支路。

示例SQL提琴

select  x.flno, 
        Max( if( y.DeptTime = x.starter, y.FromA, null )) FirstLegFrom,
        Max( if( y.DeptTime = x.starter, y.DeptTime, null )) FirstLegStart,
        Max( if( y.DeptTime = x.ender, y.ToA, null )) LastLegFrom,
        Max( if( y.DeptTime = x.ender, y.ArrTime, null )) LastLegArrival
from(
    select  flno, min(depttime) as starter, max(depttime) as ender
    from    flightleg
    group by flno
    having count(*) > 2
) x
join   flightleg y
  on   x.flno = y.flno
  and  (x.starter = y.depttime
    or  x.ender = y.depttime)
group by x.flno;

小提琴: http ://sqlfiddle.com/#!9/79640/1/0(TommCatt為提高效率提出了修改)

這不依賴於seq中的每一次飛行升序之中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM