Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql根据列B上的某些条件选择不同的列A_Sql_Postgresql - Fatal编程技术网

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上工作时,它是一个很好的解决方案。