如何根据某些条件合并记录
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 可以正常工作并且不会产生该错误。您能否发布一个新问题,并举例说明您正在做什么会产生错误,因为我无法复制它。以上是关于如何根据某些条件合并记录的主要内容,如果未能解决你的问题,请参考以下文章