在Postgresql中按日期对行进行排序(仅一个列中的第一个唯一实例)

时间:2019-05-28 10:36:40

标签: sql postgresql

所以我有一个名为“ reports”的表,其组织方式为:

id | stock_id | type | time_period | report_date

类型可以是“ Cash_Flow”,“ Income_Statement”或“ Balance_Sheet”,time_period可以是“每季度”或“每年”,report_date是日期。实际上,我想要做的是仅获取每个stock_id的最新报告(按report_date排序)。

因此,如果股票具有“现金流量”,“收入声明”和“余额表”的季度报告分别为2019-04-30和2019-01-30以及2019-04-30的年度报告, d只希望获取每只股票的最新季度报告,而不返回任何年度报告或任何较旧的报告。因此,假设表中每种报告类型有100只股票,总共8个季度(季度报告总计2400行),每种类型有2个年度报告(600行年度报告)。

所以我目前正在Ubuntu 18.04上运行postgresql 10.8。我通常不写原始sql(通常使用ORM),因此,如果答案真的很简单,那么抱歉。

因此,我为每个报告尝试了以下操作,但是它返回了所有行(按预期),而我只想要最新的行。我认为该解决方案可能需要一个独特的解决方案,但我似乎无法使用orderby。

SELECT *
FROM public.reports where time_period='quarterly' and type='Cash_Flow'  group by id, stock_id order by report_date desc;

我想要一个只返回300行的选择查询,该查询仅包含100种股票中每一种的最新3种(Income_Statement,Balance_Sheet,Cash_Flow)报告,或者如果这三种类型的报告都更容易进行3种查询每个返回100行。

1 个答案:

答案 0 :(得分:0)

  

我想要一个选择查询,该查询只返回300行,每100只股票中仅包含最新的3个报告。

使用窗口功能。假设您有100只股票:

select r.*
from (select r.*,
             row_number() over (partition by stock_id, type order by report_date desc) as seqnum
      from public.reports r
      where time_period = 'quarterly' and
            type in ( 'Cash_Flow', 'Income_Statement', 'Balance_Sheet' )
     ) r
where seqnum = 1;