【问题标题】:How to find the last entry and not the first when using INNER JOIN and CAST?使用 INNER JOIN 和 CAST 时如何找到最后一个条目而不是第一个?
【发布时间】:2023-04-11 10:00:01
【问题描述】:

我的虚拟雷达程序维护一个 SQLite3 数据库。数据库中有 2 个表,Aircraft 和 Flights。第一个存储飞机数据和特定飞机进行的其他飞行。 我想获取过去 180 天内没有航班的飞机列表。 在互联网上阅读我可以创建这个查询:

SELECT Registration,
       STRFTIME('%d-%m-%Y',Flights.EndTime) AS 'Last Flight',
       Flights.Callsign,
       CAST ((JULIANDAY('now') - JULIANDAY(Flights.EndTime)) AS INTEGER) AS 
       'Days unseen'
FROM   Aircraft
       INNER JOIN Flights ON (Aircraft.AircraftID=Flights.AircraftID)
WHERE
       CAST ((JULIANDAY('now') - JULIANDAY(Flights.EndTime))AS INTEGER) >= 180
GROUP BY Registration
ORDER BY Flights.EndTime

问题在于Flights.EndTime 是按升序编写的,因此查询会查看第一个Flights.EndTime 条目而不是最后一个条目。 是否可以查询数据库并检索180天或更长时间未见的飞机列表?

【问题讨论】:

    标签: sqlite casting inner-join


    【解决方案1】:

    使用此查询:

    SELECT *, ROW_NUMBER() OVER (PARTITION BY AircraftID ORDER BY EndTime DESC) rn
    FROM Flights 
    

    您可以按EndTime降序排列每架飞机的所有航班。

    如果将上述查询加入Aircraft,只过滤最后一个航班(行号=1),则不需要GROUP BY:

    SELECT a.Registration,
           STRFTIME('%d-%m-%Y', f.EndTime) AS `Last Flight`,
           f.Callsign,
           CAST(JULIANDAY('now') - JULIANDAY(f.EndTime) AS INTEGER) AS `Days unseen`
    FROM Aircraft a 
    INNER JOIN (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY AircraftID ORDER BY EndTime DESC) rn
      FROM Flights  
    ) f ON a.AircraftID = f.AircraftID
    WHERE f.rn = 1 AND CAST(JULIANDAY('now') - JULIANDAY(f.EndTime) AS INTEGER) >= 180
    ORDER BY f.EndTime
    

    【讨论】:

    • 真的非常感谢!我会研究你的答案以了解它的确切逻辑。
    猜你喜欢
    • 2013-02-28
    • 2014-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2011-01-04
    • 2012-08-12
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多