我正在尝试解决此问题:
我有一个查询/视图,该视图/视图将联接约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”视图中列的名称,我希望问题仍然可以理解和解决! / p>
我已经尝试过Convert keep dense_rank from Oracle query into postgres中报告的WINDOW命令,但是我无法根据需要使用该组。我做过的其他尝试都是关于Dense_rank first Oracle to Postgresql convert中所示的density_rank,但是我无法对除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分组,日期的最大值以及与该日期的行有关的其他字段。
答案 0 :(得分:0)
-因此,每个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
;