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。
我有一个 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。