我正在使用Postgres,无法获取我的表的最后一条记录:
my_query = client.query("SELECT timestamp,value,card from my_table");我如何知道时间戳是记录的唯一标识符?
发布于 2011-06-07 23:50:48
如果在“最后一条记录”下,您指的是具有最新时间戳值的记录,那么尝试这样做:
my_query = client.query("
SELECT TIMESTAMP,
value,
card
FROM my_table
ORDER BY TIMESTAMP DESC
LIMIT 1
");发布于 2011-06-07 23:51:50
您可以使用
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1假设您还想按timestamp排序
发布于 2018-07-05 03:29:39
简单方法: ORDER BY与LIMIT结合使用
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1;然而,LIMIT不是标准的,正如Wikipedia所说的那样,SQL标准的核心功能并没有显式地定义Nulls的默认排序顺序。最后,当多个记录共享最大时间戳时,只返回一行。
关系方式:
执行此操作的典型方法是检查是否没有任何行的时间戳高于我们检索的任何行。
SELECT timestamp, value, card
FROM my_table t1
WHERE NOT EXISTS (
SELECT *
FROM my_table t2
WHERE t2.timestamp > t1.timestamp
);这是我最喜欢的解决方案,也是我倾向于使用的解决方案。缺点是,当我们大致了解这个查询时,我们的意图并不是立即清晰的。
指导方式: MAX
为了避免这种情况,可以在子查询中使用MAX而不是关联。
SELECT timestamp, value, card
FROM my_table
WHERE timestamp = (
SELECT MAX(timestamp)
FROM my_table
);但是如果没有索引,则需要对数据进行两次遍历,而前面的查询只需扫描一次即可找到解决方案。也就是说,我们在设计查询时不应该考虑性能,除非有必要,因为我们可以期待优化器随着时间的推移而改进。但是,这种特殊类型的查询非常常用。
炫耀方式:窗口函数
我不建议这样做,但也许你可以给你的老板留下一个好印象;-)
SELECT DISTINCT
first_value(timestamp) OVER w,
first_value(value) OVER w,
first_value(card) OVER w
FROM my_table
WINDOW w AS (ORDER BY timestamp DESC);实际上,这表明一个简单的查询可以用各种各样的方式表达(我还能想到其他几种方式),并且应该根据以下几个标准来选择其中一种形式:
关系型/指导型ways)
https://stackoverflow.com/questions/6267887
复制相似问题