【问题标题】:Postgres query for reportPostgres 查询报告
【发布时间】:2018-09-21 16:20:56
【问题描述】:

我正在尝试解决这个问题:

我有一个查询/视图,它将连接约 10 个表以提取报告的一些字段(如果有)。该查询不使用任何分组功能,只连接和截断一些无用的数据。

我必须采取这个大视图,获取第一个索引的组,在第二列中获取日期的最大值,并从引用最大值记录的其他字段中获取所有信息。

我无法在 postgres 中做到这一点。 作为伪代码,我可以给出:

select 1
     , max(2)
     , 3 referred to the record from max(2)
     , 4 referred to the record from max(2)
     , ...
     , 20 referred to the record from max(2)
  from (ViewWithAllJoins) a
group by 1

出于隐私和业务问题,我不得不混淆一些信息,1/2/3/4...是视图“ViewWithAllJoins”中的列名称,我希望问题仍然可以理解和解决!

我已尝试使用 Convert keep dense_rank from Oracle query into postgres 中报告的 WINDOW 命令,但我无法使用我需要的组。我所做的其他尝试是关于dense_rank,如Dense_rank first Oracle to Postgresql convert 所示,但我不能对除1和2之外的任何其他字段中的数据顺序做任何假设,所以我不能使用它们上的任何聚合函数。

有什么想法吗?可能不需要添加太多子查询。

谢谢!

编辑:

按照建议,我将添加一些合成数据以更好地理解问题和我想要的。

开始:

    ID             DATE            COLUMN1      COLUMN2     COLUMN3
=====================================================================
 88888888;"2016-04-02 09:00:00";"aaaaaaaaaaa";"TEXT89"    ; 999999999
 88888888;"2018-08-21 09:00:00";"a"          ;"TEXT1"     ; 988888888
 88888888;"2017-11-09 09:00:00";"zzzz"       ;"TEXT80000" ; 850580582
 75858585;"2017-01-31 09:00:00";"~~~~~~~~~~~";"TEXT10"    ; 101010101
 75858585;"2018-04-02 09:00:00";"eeeeeeeeeee";"TEXT1000"  ; 111111111
 99999999;"2016-04-02 09:00:00";"8d2ecafd866";"TEXT808911"; 777777777

我想要什么:

    ID             DATE            COLUMN1      COLUMN2     COLUMN3
===================================================================
 88888888;"2018-08-21 09:00:00";"a"          ;"TEXT1"     ; 988888888
 75858585;"2018-04-02 09:00:00";"eeeeeeeeeee";"TEXT1000"  ; 111111111
 99999999;"2016-04-02 09:00:00";"8d2ecafd866";"TEXT808911"; 777777777

所以按id分组,日期的最大值和与最大日期行相关的其他字段。

【问题讨论】:

  • @a_horse_with_no_name 抱歉,没想到。已添加,希望对您有所帮助!
  • 所以你每个 ID 都有重复的记录,对于每个 ID,你想选择最近日期的记录?
  • @joop 基本上是的,字段来自不同的实体/表

标签: postgresql


【解决方案1】:

-- 所以每个 ID 都有重复的记录,并且对于每个 ID,您要选择最近日期的记录?

使用不存在:


SELECT id,zdate,column1,column2,column3 -- , ...
FROM queryview t
WHERE NOT EXISTS (
        SELECT *
        FROM queryview x
        WHERE x.id=t.id
        AND x.zdate > t.zdate
        );

或者,在窗口上使用 row_number(),并只选择具有最终日期的行:


SELECT id,zdate,column1,column2,column3 -- , ...
FROM ( SELECT *
        , row_number() OVER(PARTITION BY id, ORDER BY zdate DESC) AS rn
        FROM queryview
        ) q
WHERE q.rn = 1
        ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多