select 另一列为最大值或最小值的列值

select col value where another col is max or min

我有一个 table 看起来像这样:

user      timestamp1                     timestamp2
a         2020-10-07T15:36:01.323Z       2020-10-07T15:36:01.323Z
b         2020-10-07T15:36:01.323Z       2020-10-07T15:36:01.323Z

我可以这样计算最大或最小时差:

min((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) AS min
max((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) AS max

但是我如何制定一个 sql (sqlite) 查询,以便我可以在 table 中提取用户名 + 最小最大值?

最终结果可能如下所示:

type    user     time
max     a        679..
min     b        12..

我试过这样的东西来测试:

"select user, ((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) AS val from mytable where ((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) == min((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) 

我希望这将 return 用户名和最小值贯穿始终,像这样:

user    val
a       12...

但我得到一个错误:

PandaSQLException: (sqlite3.OperationalError) misuse of aggregate function min()

最简单的解决方案是在 2 个单独的查询中使用 MIN()MAX() 聚合函数,并对结果使用 UNION ALL

SELECT 'max' type, user, MAX((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) time FROM tablename
UNION ALL
SELECT 'min' type, user, MIN((JULIANDAY(timestamp2) - JULIANDAY(timestamp1)) * 24) time FROM tablename

此查询使用 SQLite 的 bare columns 功能。

我还建议使用 strftime() 而不是 JULIANDAY(),因为它会提供更好的准确性:

SELECT 'max' type, user, MAX((strftime('%s', timestamp2) - strftime('%s', timestamp1)) / 3600.0) time FROM tablename
UNION ALL
SELECT 'min' type, user, MIN((strftime('%s', timestamp2) - strftime('%s', timestamp1)) / 3600.0) time FROM tablename

参见demo