Postgresql根据列B上的某些条件选择不同的列A
我有一个数据表:Postgresql根据列B上的某些条件选择不同的列A,sql,postgresql,Sql,Postgresql,我有一个数据表: +--------+---------+ |用户ID |状态| +--------+---------+ |用户| 1 |成功| |用户|2|失败| |用户| 2 |成功| |用户_3|失败| |用户_3|失败| +--------+---------+ 我希望我的查询输出在userid上是不同的,但条件是status列中的值介于fail和success之间。我想改为选择success(如果user_3中的fail,则选择fail)。下表显示了我希望得到的结果: +-----
+--------+---------+
|用户ID |状态|
+--------+---------+
|用户| 1 |成功|
|用户|2|失败|
|用户| 2 |成功|
|用户_3|失败|
|用户_3|失败|
+--------+---------+
我希望我的查询输出在userid
上是不同的,但条件是status
列中的值介于fail
和success
之间。我想改为选择success
(如果user_3
中的fail
,则选择fail
)。下表显示了我希望得到的结果:
+--------+---------+
|用户ID |状态|
+--------+---------+
|用户| 1 |成功|
|用户| 2 |成功|
|用户_3|失败|
+--------+---------+
任何有效的查询都会很好。谢谢 这里有一个非常有效的方法来获得您需要的结果
SELECT userid, MAX(status)
FROM table1
GROUP BY userid
MAX()函数也适用于字符串。
因为“成功”>“失败”,
如果一个用户ID有一行“成功”和一行“失败”,那么最大值就是“成功”这是一种获得所需结果的非常有效的方法
SELECT userid, MAX(status)
FROM table1
GROUP BY userid
MAX()函数也适用于字符串。
因为“成功”>“失败”,
如果一个用户ID有一行“成功”和一行“失败”,则最大值为“成功”使用
在
上选择DISTINCT,这提供了一种简单易读的方法来获取用户ID上唯一的行。按
排序的确保在排序'fail'
之前先排序状态='success'
,因此如果存在,则选择'success'
:
SELECT DISTINCT ON (userid) userid,
status
FROM my_table
ORDER BY userid,
status DESC;
注意:(状态,用户ID)
上的多列索引可能有助于提高性能。此外,在某些情况下,使用groupby
(参见Terence的答案)的查询可能比使用DISTINCT
的查询更快
选择DISTINCT ON(表达式[,…])
仅保留第一行
给定表达式计算为相等的每组行的。。。
表达式上的DISTINCT必须与最左边的ORDER BY
表达式。orderby
子句通常包含额外的
表达式,用于确定所需的行优先级
每个组上的每个都不同
(From)使用在
上选择DISTINCT,这提供了一种简单易读的方法来获取用户ID上唯一的行。按
排序的确保在排序'fail'
之前先排序状态='success'
,因此如果存在,则选择'success'
:
SELECT DISTINCT ON (userid) userid,
status
FROM my_table
ORDER BY userid,
status DESC;
注意:(状态,用户ID)
上的多列索引可能有助于提高性能。此外,在某些情况下,使用groupby
(参见Terence的答案)的查询可能比使用DISTINCT
的查询更快
选择DISTINCT ON(表达式[,…])
仅保留第一行
给定表达式计算为相等的每组行的。。。
表达式上的DISTINCT必须与最左边的ORDER BY
表达式。orderby
子句通常包含额外的
表达式,用于确定所需的行优先级
每个组上的每个都不同
(从)第一个选择状态是成功用户ID
select distinct userid,status from yourtable where status='success'
第二个选择用户标识不包含成功状态
select distinct userid,status from yourtable where
userid not in(select distinct userid from yourtable where status='success')
然后是工会
select distinct userid,status from yourtable where status='success'
union
select distinct userid,status from yourtable where
userid not in(select distinct userid from yourtable where status='success')
第一个选择状态是success userid
select distinct userid,status from yourtable where status='success'
第二个选择用户标识不包含成功状态
select distinct userid,status from yourtable where
userid not in(select distinct userid from yourtable where status='success')
然后是工会
select distinct userid,status from yourtable where status='success'
union
select distinct userid,status from yourtable where
userid not in(select distinct userid from yourtable where status='success')
我不知道这个。它不是标准的SQL,但在postgresql上运行时,它是一个很好的解决方案。我不知道这个。它不是标准的SQL,但在postgresql上工作时,它是一个很好的解决方案。