如何根据某些条件合并记录

Posted

技术标签:

【中文标题】如何根据某些条件合并记录【英文标题】:How can I combine records on the basis of some conditions 【发布时间】:2016-07-11 08:24:12 【问题描述】:

我有下表,

id   id_concept  start_date  end_date
----------------------------------------------
100    282        20/06/2016  24/06/2016 
100    282        15/07/2016  18/07/2016
300    282        01/09/2016  02/09/2016

我需要合并具有相同 id、id_concept 的记录,并且一条记录的 END_DATE 和下一条记录的 START_DATE 之间的时间为 30 天或更短(

对于合并的记录,我需要将 start_date 作为记录的第一个 start_date,将 end_date 作为最后一条记录的 end_date

o/p 应该是这样的,

     id    id_concept start_date  end_date      count
    ---------------------------------------------------
    100    282        20/06/2016  18/07/2016      2
    300    282        01/09/2016  02/09/2016      1

【问题讨论】:

请仅添加与您正在使用的 DBMS 相关的标签。你真的使用 Oracle Postgres Redshift吗? 【参考方案1】:

SQL Fiddle

PostgreSQL 9.3 架构设置

CREATE TABLE table_name ( id, id_concept, start_date, end_date ) AS
SELECT 100, 282, DATE '2016-06-20', DATE '2016-06-24' UNION ALL
SELECT 100, 282, DATE '2016-07-15', DATE '2016-07-18' UNION ALL
SELECT 300, 282, DATE '2016-09-01', DATE '2016-09-02';

查询 1

SELECT id,
       id_concept,
       MIN( start_date ) AS start_date,
       MAX( end_date ) AS end_date,
       COUNT(*) AS "count"
FROM   (
  SELECT id,
         id_concept,
         start_date,
         end_date,
         SUM( diff ) OVER (
           PARTITION BY id, id_concept
           ORDER BY start_date, end_date
         ) AS grp
  FROM   (
    SELECT t.*,
           CASE
           WHEN LAG( end_date ) OVER (
                  PARTITION BY id, id_concept
                  ORDER BY start_date, end_date
                ) >= start_date - INTERVAL '30' DAY
           THEN 0
           ELSE 1
           END AS diff
    FROM   table_name t
  ) t
) t
GROUP BY id, id_concept, grp

Results

|  id | id_concept |                  start_date |                    end_date | count |
|-----|------------|-----------------------------|-----------------------------|-------|
| 300 |        282 | September, 01 2016 00:00:00 | September, 02 2016 00:00:00 |     1 |
| 100 |        282 |      June, 20 2016 00:00:00 |      July, 18 2016 00:00:00 |     2 |

【讨论】:

@MTO....出现错误“使用 ORDER BY 子句聚合窗口函数需要框架子句”。你能检查一下吗 @Chinnu 上面的 SQL Fiddle 可以正常工作并且不会产生该错误。您能否发布一个新问题,并举例说明您正在做什么会产生错误,因为我无法复制它。

以上是关于如何根据某些条件合并记录的主要内容,如果未能解决你的问题,请参考以下文章

合并重复记录,根据MySql中的条件值保留一些数据

根据映射条件合并 XML

如何根据条件合并两个数据集

如何根据条件合并两个数据框?

Python Pandas:如何根据“OR”条件进行合并?

使用合并时删除某些行