当前位置: 首页 > 知识库问答 >
问题:

在postgresql中选择一行中的前k列值

单品
2023-03-14

我有下面的表格结构

CREATE TABLE myTable (
  id1 INTEGER,

  key1 VARCHAR,
  key2 VARCHAR,
  key3 VARCHAR,
  key4 VARCHAR,
  key5 VARCHAR,

  val1 DOUBLE PRECISION,
  val2 DOUBLE PRECISION,
  val3 DOUBLE PRECISION,
  val4 DOUBLE PRECISION,
  val5 DOUBLE PRECISION
);

我试图编写查询,以选择前3个瓦尔列和它们对应的关键字之间给定的5个关键字-瓦尔对。

类似id1,key1,val1,key2,val2,key3,val3。

SELECT CASE WHEN val1 = GREATEST(val1, val2, val3, val4, val5) THEN key1 
WHEN val2 = .... THEN val2
.....
END AS top_key

  ,GREATEST(val1, val2, val3, val4, val5) AS top_val
FROM myTable
WHERE id1 = ?

共有1个答案

佘俊茂
2023-03-14

试试这个。它基本上为每一行创建一个(key,value)对的“临时”表,然后为每一行选择前三个对。

SELECT t.id, 
    (array_agg((a.k, a.v) ORDER BY a.v DESC))[1] AS kv1,
    (array_agg((a.k, a.v) ORDER BY a.v DESC))[2] AS kv2,
    (array_agg((a.k, a.v) ORDER BY a.v DESC))[3] AS kv3
FROM t
CROSS JOIN LATERAL (
    SELECT * FROM (VALUES (t.k1, t.v1), (t.k2, t.v2), (t.k3, t.v3), (t.k4, t.v4), (t.k5, t.v5)) AS a(k, v)
) AS a
GROUP BY t.id

请点击这里:http://sqlfiddle.com/#!17/6 B0C5/2

 类似资料:
  • 我想编写一个简单的查询来选择PostgreSQL中的许多列。但是,我一直收到错误-我尝试了几个选项,但它们对我不起作用。目前我收到以下错误: 组织。postgresql。util。PSQLException:错误:“列”处或附近出现语法错误 要获取具有值的列,请尝试以下操作: 有什么想法吗?

  • 问题内容: 我想根据或月份的月份选择行,如下所示: 但是我只在PostgreSQL中收到错误消息。 如何才能做到这一点? 问题答案: 您可以使用函数,如下所示: 您的问题来自PostgreSQL中没有诸如函数之类的事实。在此处查看在线文档,以了解可以得到什么。应该足够了。

  • 问题内容: 我想编写一个简单的查询来选择PostgreSQL中的许多列。但是,我不断收到错误-我尝试了一些选项,但它们对我没有用。目前,我收到以下错误: org.postgresql.util.PSQLException:错误:“列”处或附近的语法错误 要获取具有值的列,请尝试以下操作: 有任何想法吗? 问题答案: 是 保留字 。除非您双引号,否则不能将其用作标识符。像:。 不过,这并不意味着您应

  • 我有一个表和几个线程(系统),它们从表中读取特定列并更新它。因此,我的问题如下: 我想确保在任何时候只有一个线程可以选择和更新该列。最好的解决方案是什么? PS:据我所知,在SQL Server中使用事务会锁定事务中的所有资源,但我对PostgreSQL一无所知。 非常感谢。

  • 问题内容: 我有表,其中有一列可能在突发中具有相同的值。像这样: 现在,我要修剪重复值的行,并仅选择第一个出现的行。 对于上表,结果应为: 如何在SQL中执行此操作? 请注意,仅应删除突发行,并且可以在非突发行中重复值! &在样本结果中重复。 编辑: 我用这个实现了它: 但这仅在ID为顺序的时才有效。id(已删除的ID)之间有间隔,查询中断。我怎样才能解决这个问题? 问题答案: 您可以使用半联接来

  • 我有一个查询生成器来选择在过去12个月中创建的所有用户 这个查询在MySQL上很好地工作,但是,当我将它部署在使用PostgreSQL数据库运行的Heroku上时,它返回一个错误 PostgreSQL是否有任何命名规则来为选定的列设置名称,或者它是否有任何方法来解决我的问题?感谢阅读!