因此,我对基于状态获取最新数据的查询有一个问题

例如我有一张这样的桌子

Schema (PostgreSQL v12)

CREATE TABLE test(
  id INTEGER,
  user_id INTEGER,
  product VARCHAR(20),
  status VARCHAR(20)
  );
  
INSERT INTO test VALUES(1,1,'WALK','ACTIVE');
INSERT INTO test VALUES(2,1,'RUN','ACTIVE');
INSERT INTO test VALUES(3,2,'WALK','INACTIVE');
INSERT INTO test VALUES(4,2,'RUN','ACTIVE');
INSERT INTO test VALUES(5,3,'WALK','UPDATING');
INSERT INTO test VALUES(6,3,'RUN','ACTIVE');
INSERT INTO test VALUES(7,4,'WALK','UPDATING');
INSERT INTO test VALUES(8,4,'RUN','INACTIVE');
INSERT INTO test VALUES(9,2,'RUN','UPDATING');

Query #1

SELECT * FROM test;
id user_id product status
1 1 WALK ACTIVE
2 1 RUN ACTIVE
3 2 WALK INACTIVE
4 2 RUN ACTIVE
5 3 WALK UPDATING
6 3 RUN ACTIVE
7 4 WALK UPDATING
8 4 RUN INACTIVE
9 2 RUN UPDATING

View on DB Fiddle

基本上,我需要一个查询来获取最新的用户id状态,以及仅用于活动和更新的状态.但是,如果存在活动和更新,他们会 Select 活动的.

user_id status
1 ACTIVE
2 ACTIVE
3 ACTIVE
4 UPDATING

我try 了这个,但它只返回最新的值

SELECT distinct on (user_id) user_id, status
FROM test
ORDER BY user_id DESC

推荐答案

另一个 Select :

SELECT distinct on (user_id) user_id, status
FROM test
where status != 'INACTIVE'
ORDER BY user_id, array_position('{ACTIVE,UPDATING}', status)

当您执行distinct on时,order by对于不同的字段(在本例中为user_id)是必需的,但您also需要在这之后指定排序标准,以确定要显示的不同记录.

换句话说,您只想按用户id显示一条记录,但如何确定哪条记录?这就是为什么你需要顺序中的第二个参数.

Sql相关问答推荐

如何简化此表达以使搜索查询忽略标点符号?Microsoft Access 2007-2016

Postgresql在加入时显示重复的行

Postgresql:从jsons数组到单个id索引的json

SQL是否可以计算每年的所有日期变化?

雅典娜嵌套Json提取液

SQL:如何取上一年的平均值?

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

如何在SQL Server中统计按备注分组的记录数

HAVING子句内部过滤的正确方法

了解多个分组集

更正用于判断错误组合的SQL

在子窗口SQL Presto中使用特定条件执行值计数

SQL按组 Select 最小值,当值不存在时为Null

STContains、STIntersections和STWithin返回错误的地理结果

Select 一个非零值减少重复

HIVE SQL where 子句未按预期工作

Set vs let vs 在snowflake中声明变量

计算 PostgreSQL 中的平均会话长度

连接表时避免重复

在 UTF 编码字符上应用 SQL LIKE 语句没有给出任何结果