【问题标题】:How to sort and group data in request?如何对请求中的数据进行排序和分组?
【发布时间】:2021-03-21 17:31:28
【问题描述】:

我有桌子。

ID       section_name     purchaseNumber    docPublishDate  parsing_status
88940   notifications   0373200124515000035   2015-02-27       null
88939   notifications   0373200124515000035   2015-02-29       null
88938   notifications   0373200124515000034   2015-02-27       null
88687   notifications   0373100064615000120   2015-02-28       null
88937   notifications   0373100064615000120   2015-02-27       null
89122   notifications   0373100064615000120   2015-02-27       null
88936   notifications   0373200124515000032   2015-02-27       null
88988   notifications   0373100064615000120   2015-03-02       null
88696   notifications   0373100066915000038   2015-02-27       null
88963   notifications   0373200174515000013   2015-02-27       null

它在purchaseNumber 中有一些重复项。我只需要从这个表中选择最新的记录进行处理。 换句话说,我需要:

  1. purchaseNumber对元素进行分组
  2. docPublishDate 对它们进行排序并选择最新的。
  3. 如果组中的任何元素的状态为 parsing_status true(假设它是第 2 步中最新的),则不应返回任何元素。

处理后parsing_status 标志变为true

docPublishDate - 时间戳

如果最后一个最新的项目被处理,则不应选择具有旧日期的项目。 我试着做一些分组。但是代码只是简单地将所有数据返回给我:

SELECT 
  "id", "section_name", "purchaseNumber", "docPublishDate", "parsing_status"
  FROM "xml_files" WHERE parsing_status IS NULL GROUP BY "purchaseNumber", "id", "section_name", "docPublishDate", "parsing_status" ORDER BY "docPublishDate" DESC 

【问题讨论】:

  • 目前还不清楚你想要什么结果。在您的示例数据中,所有行在parsing_status 列中都有null 值:您的查询不会返回任何行。请提供具有代表性的样本数据以及您想要的结果。
  • @GMB,我在帖子中添加了更多解释。和固定的桌子。
  • 你能不能也分享一下预期的结果。

标签: sql postgresql datetime subquery greatest-n-per-group


【解决方案1】:

我了解您希望每次购买的最新行,解析状态为 true 的除外。一种选择是在子查询中使用distinct on 来获取最新的元素,然后在外部查询中进行过滤:

select *
from (
    select distinct on (purchasenumber) x.*
    from xml_files x
    order by purchasenumber, docpublishdate desc
) x
where parsing_status is distinct from true

【讨论】:

  • 我收到错误:operator does not exist: character varying = boolean
  • @DmitryBubnenkov:如果parsing_status 是字符串数据类型而不是布尔值,只需更改where 子句:where parsing_status is distinct from 'true'
  • 谢谢。 x.* 在做什么?
  • @DmitryBubnenkov:这只是一个表别名。
【解决方案2】:

你可以使用NOT EXISTS如下:

SELECT * FROM YOUR_TABLE T
 WHERE NOT EXISTS (SELECT 1 FROM YOUR_TABLE TT
                    WHERE T.PURCHASENUMBER = TT.PURCHASENUMBER
                      AND (TT.DOCPUBLISHDATE > T.DOC_PUBLISHDATE 
                           OR T.PARSINGSTATUS = 'true') );
                     

【讨论】:

  • 您能解释一下它是如何工作的吗?我是关于子查询的
  • 它为每个PURCHASENUMBER 返回具有最大DOCPUBLISHDATE 的表中的记录,但如果对于相同的PURCHASENUMBER 有一条记录具有PARSINGSTATUS = 'true',则不会给出结果class="comcopy">跨度>
  • Ans 那么速度呢?即使不是很大的桌子也需要很多时间
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多