sql - 创建 Postgres 交叉表查询并计算列之间的差异

标签 sql postgresql

Tni分析

我有格式的数据

Patid | TNT     | date
 A123 | 1.2.    | 23/1/2012
 A123 | 1.3.    | 23/1/2012
 B123 | 2.6.    | 24/7/2011
 B123 | 2.7.    | 24/7/2011

我希望能够像这样计算两行之间的差异

rowid. | TNT-1. | TNT-2. | difference
A123.  |. 1.2.  | 1.3.   | 0.1
B123.  | 2.6.   | 2.7.   | 0.1

Etc

我认为这是 Postgres 中交叉表功能的一个用途,但我正在努力获得结果。非常感谢任何帮助。

最佳答案

您可以手动旋转然后取差(假设每个 Patid 始终有 2 条记录并且您不必考虑 date):

with cte1 as (
    select
        Patid, TNT, date, row_number() over(partition by Patid order by TNT) as rn
    from Table1
), cte2 as (
    select
        Patid,
        max(case when rn = 1 then TNT end) as "TNT-1",
        max(case when rn = 2 then TNT end) as "TNT-2"
    from cte1
    group by Patid
)
select
    Patid as rowid, "TNT-1", "TNT-2", "TNT-2" - "TNT-1" as difference
from cte2

-------------------------------------
ROWID    TNT-1    TNT-2    DIFFERENCE
A123       1.2      1.3           0.1
B123       2.6      2.7           0.1

sql fiddle demo

关于sql - 创建 Postgres 交叉表查询并计算列之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402303/

相关文章:

sql - 两个计数语句之间的区别

sql - 如何在没有ORDER BY的情况下订购UNION中的条目?

java - 当我们在 hibernate 中获取 ="join"和 lazy ="true"时会发生什么

mysql - 多条件查询的 SQL 语句,包括 3 个最近的日期

java - 带有 Android 应用程序的 Golang 后端

json - 格式 JSON Postgresql

ruby-on-rails - Rails 应用程序保持这么多空闲的 Puma 和 Postgres 连接是否正常?

mysql - 如何用sql获取按周滚动的数据集

php - 拉维尔 : Error [PDOException]: Could not Find Driver in PostgreSQL?

sql - 使用 ORDER BY 和限制 1 优化 PostgreSQL 查询