如何对请求中的数据进行排序和分组?

Posted

技术标签:

【中文标题】如何对请求中的数据进行排序和分组?【英文标题】: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 中有一些重复项。我只需要从这个表中选择最新的记录进行处理。 换句话说,我需要:

    purchaseNumber对元素进行分组 按docPublishDate 对它们进行排序并选择最新的。 如果组中的任何元素的状态为 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,我在帖子中添加了更多解释。和固定的桌子。 你能不能也分享一下预期的结果。 【参考方案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 那么速度呢?即使不是很大的桌子也需要很多时间

以上是关于如何对请求中的数据进行排序和分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 sql 查询对数据集进行排序或分组

winform中如何对一个 datatable 中的数据 进行 分组统计 需要 count 和group by

有没有办法使用自定义分组对 SQL 中的输出数据进行排序?

Hadoop学习笔记—11.MapReduce中的排序和分组

三、MySQL数据库之分组排序

如何按熊猫中的中值对箱线图进行排序