Oracle SQL -没有聚合的PIVOT值

ulmd4ohb  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(145)

我的表看起来像这样:

|ID|Dates|Is_Active|
|----|----|----|
|718844 |13/07/2023 18:00 - 13/07/2023 19:00|   0|
|718842 |13/07/2023 08:00 - 13/07/2023 15:00|   0|
|718844 |13/07/2023 06:00 - 13/07/2023 18:00|   0|
|718842 |13/07/2023 06:00 - 13/07/2023 08:00|   0|
|718842 |13/07/2023 15:00 - 13/07/2023 17:00|   0|
|718844 |13/07/2023 18:00 - 13/07/2023 19:00|   1|
|718844 |13/07/2023 06:00 - 13/07/2023 18:00|   1|
|718842 |13/07/2023 08:00 - 13/07/2023 10:00|   1|
|718842 |13/07/2023 13:00 - 13/07/2023 15:00|   1|
|718842 |13/07/2023 10:00 - 13/07/2023 13:00|   1|
|718842 |13/07/2023 06:00 - 13/07/2023 08:00|   1|
|718842 |13/07/2023 15:00 - 13/07/2023 17:00|   1|

字符串
我需要转换我的数据,以便在单独的列中显示活动/非活动日期。

|ID|Inactive|Active|
|----|----|----|
|718844 |13/07/2023 18:00 - 13/07/2023 19:00|13/07/2023 18:00 - 13/07/2023 19:00|
|718842 |13/07/2023 08:00 - 13/07/2023 15:00|13/07/2023 06:00 - 13/07/2023 18:00|
|718844 |13/07/2023 06:00 - 13/07/2023 18:00|13/07/2023 08:00 - 13/07/2023 10:00|
|718842 |13/07/2023 06:00 - 13/07/2023 08:00|13/07/2023 13:00 - 13/07/2023 15:00|
|718842 |13/07/2023 15:00 - 13/07/2023 17:00|13/07/2023 10:00 - 13/07/2023 13:00|
|718844 |                                   |13/07/2023 06:00 - 13/07/2023 08:00|
|718844 |                                   |13/07/2023 15:00 - 13/07/2023 17:00|


我试图使用枢轴,但它需要聚合,我不想要的。你知道我该怎么解决吗?
数据来源:

CREATE GLOBAL TEMPORARY TABLE my_gtt (id         NUMBER
                                                      ,dates      VARCHAR2(200)
                                                      ,is_active  NUMBER
                                                      ) ON COMMIT PRESERVE ROWS;

INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 06:00 - 13/07/2023 08:00', 0);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 08:00 - 13/07/2023 15:00', 0);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 15:00 - 13/07/2023 17:00', 0);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 06:00 - 13/07/2023 08:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 10:00 - 13/07/2023 13:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 15:00 - 13/07/2023 17:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 13:00 - 13/07/2023 15:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718842, '13/07/2023 08:00 - 13/07/2023 10:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718844, '13/07/2023 06:00 - 13/07/2023 18:00', 0);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718844, '13/07/2023 06:00 - 13/07/2023 18:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718844, '13/07/2023 18:00 - 13/07/2023 19:00', 1);
INSERT INTO my_gtt (id, dates, is_active) VALUES (718844, '13/07/2023 18:00 - 13/07/2023 19:00', 0);

ohtdti5x

ohtdti5x1#

使用ROW_NUMBER解析函数为每行idis_active值提供一个唯一值,然后PIVOT使用该唯一值,这样就不会有多个值被聚合:

SELECT id,
       inactive,
       active
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (PARTITION BY id, is_active ORDER BY dates) AS rn
  FROM   my_gtt t
)
PIVOT ( MAX(dates) FOR is_active IN (0 AS inactive, 1 AS active) )

字符串
对于您的示例数据,输出:
| 不活动|活动| ACTIVE |
| --|--| ------------ |
| 2023年7月13日06:00 - 2023年7月13日08:00| 2023年7月13日06:00 - 2023年7月13日08:00| 13/07/2023 06:00 - 13/07/2023 08:00 |
| 2023年7月13日08:00 - 2023年7月13日15:00| 2023年7月13日08:00 - 2023年7月13日10:00| 13/07/2023 08:00 - 13/07/2023 10:00 |
| 13/07/2023 15:00 - 13/07/2023 17:00| 13/07/2023 10:00 - 13/07/2023 13:00| 13/07/2023 10:00 - 13/07/2023 13:00 |
| * 空 *| 13/07/2023 13:00 - 13/07/2023 15:00| 13/07/2023 13:00 - 13/07/2023 15:00 |
| * 空 *| 13/07/2023 15:00 - 13/07/2023 17:00| 13/07/2023 15:00 - 13/07/2023 17:00 |
| 2023年7月13日06:00 - 2023年7月13日18:00| 2023年7月13日06:00 - 2023年7月13日18:00| 13/07/2023 06:00 - 13/07/2023 18:00 |
| 2023年7月13日18:00 - 2023年7月13日19:00| 2023年7月13日18:00 - 2023年7月13日19:00| 13/07/2023 18:00 - 13/07/2023 19:00 |
fiddle

相关问题