如何对请求中的数据进行排序和分组?
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 那么速度呢?即使不是很大的桌子也需要很多时间以上是关于如何对请求中的数据进行排序和分组?的主要内容,如果未能解决你的问题,请参考以下文章
winform中如何对一个 datatable 中的数据 进行 分组统计 需要 count 和group by