我正在使用Postgres,但无法获取我的表的最后一条记录:
my_query = client.query("SELECT timestamp,value,card from my_table");
如何知道时间戳是记录的唯一标识符,从而进行操作?
my_query = client.query("SELECT timestamp,value,card from my_table");
如何知道时间戳是记录的唯一标识符,从而进行操作?
如果您所说的 "last record" 是指具有最新时间戳值的记录,则可以尝试以下方法:
my_query = client.query("
SELECT TIMESTAMP,
value,
card
FROM my_table
ORDER BY TIMESTAMP DESC
LIMIT 1
");
你可以使用
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1
假设你也想按 timestamp
进行排序?
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1;
然而,LIMIT不是标准,正如维基百科所述,SQL标准的核心功能没有明确定义空值的默认排序顺序。最后,当多个记录共享最大时间戳时,仅返回一行。
通常的做法是检查没有任何一行具有比我们检索到的任何一行更高的时间戳。
SELECT timestamp, value, card
FROM my_table t1
WHERE NOT EXISTS (
SELECT *
FROM my_table t2
WHERE t2.timestamp > t1.timestamp
);
这是我最喜欢的解决方案,也是我倾向于使用的解决方案。缺点是一眼看去,我们的意图并不清晰。
为了避免这个问题,可以在子查询中使用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);
实际上,这样做的好处是展示了一个简单查询可以用多种方式表达(我还可以想到其他几种),而选择其中一种形式应根据以下几个标准进行:
select * from <tablename> offset ((select count(*) from <tablename>)-1)
2201X: OFFSET 必须不是负数
。 - AndrusSELECT timestamp,value,card FROM my_table WHERE id=(select max(id) from my_table)
假设每插入一行新数据都会使用该表ID的最高整数值。
如果您接受小费,请在此表格中创建一个序列号ID。该字段的默认值为:
nextval('table_name_field_seq'::regclass).
pg_query($connection, "SELECT currval('table_name_field_seq') AS id;
userid |username | createdtime |
1 | A | 1535012279455 |
2 | B | 1535042279423 | //as per created time, this is the last row
3 | C | 1535012279443 |
4 | D | 1535012212311 |
5 | E | 1535012254634 | //as per insertion order, this is the last row
userid |username | createdtime |
2 | B | 1535042279423 |
当3返回时,
userid |username | createdtime |
5 | E | 1535012254634 |
UPDATE USERS SET USERNAME = 'Z' WHERE USERID='3'
userid |username | createdtime |
1 | A | 1535012279455 |
2 | B | 1535042279423 |
4 | D | 1535012212311 |
5 | E | 1535012254634 |
3 | Z | 1535012279443 |
userid |username | createdtime |
3 | Z | 1535012279443 |
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1
-- Create a function that always returns the last non-NULL item
CREATE OR REPLACE FUNCTION public.last_agg ( anyelement, anyelement )
RETURNS anyelement LANGUAGE SQL IMMUTABLE STRICT AS $$
SELECT $2;
$$;
-- And then wrap an aggregate around it
CREATE AGGREGATE public.LAST (
sfunc = public.last_agg,
basetype = anyelement,
stype = anyelement
);
select ... limit 1
,但如果您需要在聚合内执行此操作并希望避免子查询,则此方法很有用。
SELECT id,value,card FROM my_table ORDER BY id DESC LIMIT 1;
翻译为:从我的表中选择id、value和card列,按照id降序排序后,选择第一条数据。 - deviusCURRVAL(<序列名称>)
。 - bpgergo