使用 INNER JOIN 和 CAST 时如何找到最后一个条目而不是第一个条目?
How to find the last entry and not the first when using INNER JOIN and CAST?
我的虚拟雷达程序维护着一个 SQLite3 数据库。数据库中有 2 个表,Aircraft 和 Flights。第一个存储飞机数据和特定飞机进行的其他飞行。
我想获得过去 180 天内没有航班的飞机列表。
在 Internet 上阅读我可以创建此查询:
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 天或更长时间未出现的飞机列表?
使用此查询:
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
我的虚拟雷达程序维护着一个 SQLite3 数据库。数据库中有 2 个表,Aircraft 和 Flights。第一个存储飞机数据和特定飞机进行的其他飞行。 我想获得过去 180 天内没有航班的飞机列表。 在 Internet 上阅读我可以创建此查询:
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 天或更长时间未出现的飞机列表?
使用此查询:
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