sql - 如何选择每个项目具有最大时间戳的行集?

标签 sql sqlite greatest-n-per-group

使用Sqlite,我想获取时间戳最大的行集合。该表包含项的属性,即键-值对和时间戳。我想为每个属性选择最新值。

考虑以下简化的架构和数据:

CREATE TABLE Properties (thing VARCHAR,
                         key VARCHAR,
                         value VARCHAR,
                         timestamp INT);
INSERT INTO Properties VALUES ("apple", "color", "red", 0);
INSERT INTO Properties VALUES ("apple", "taste", "sweet", 0);
INSERT INTO Properties VALUES ("apple", "size", "small", 0);
INSERT INTO Properties VALUES ("watermelon", "taste", "sweet", 0);
INSERT INTO Properties VALUES ("watermelon", "size", "large", 0);
INSERT INTO Properties VALUES ("watermelon", "color", "pink", 1);
INSERT INTO Properties VALUES ("watermelon", "color", "green", 0);


我想写一个查询thing="watermelon"返回:

taste|sweet
size|large
color|pink


请注意,有两个带有key="color"的行,查询将返回具有最大timestamp值的行。同样,一个属性的最大timestamp可能与另一属性不同。

到目前为止,我尝试过的内容包括:

获取thing="watermelon"的属性集:

SELECT DISTINCT(key) FROM Properties WHERE thing='watermelon';


获取key="color"的最新值thing="watermelon"

SELECT * 
FROM Properties
WHERE thing='watermelon'
  AND key='color'
ORDER BY timestamp DESC
LIMIT 1;


但是我不知道如何将两者结合起来。我可能是从命令式编程的角度来解决这个问题的,这就是为什么我需要帮助。

最佳答案

在SQLite 3.7.11或更高版本中,您可以简单地使用MAX()从组中选择一行:

SELECT key, value, MAX(timestamp)
FROM Properties
WHERE thing = 'watermelon'
GROUP BY key;

关于sql - 如何选择每个项目具有最大时间戳的行集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32540876/

相关文章:

sql - 在联合选择中返回唯一结果

MySQL 插入忽略重复项但因外键错误而失败

android - 如何使用 Drive.API 从 Google Drive 下载文件?

ios - 无法使用 SWIFT 更新数据库 FMDB 中的字段

ruby-on-rails - Rake 正在中止,因为 sqlite db 的未定义方法 `inet'

mysql - 独特的一栏

mysql - 为什么向此 MySQL 查询添加特定的 where 子句会成为性能瓶颈?

sql - Case 表达式,如何从 Then 子句中的列中获取值

sql - 根据字段组合选择最新结果

mysql - 具有多个表连接的每个组的前 N ​​个