在使用分析功能方面需要帮助

Need help in using Analytical function

 sELECT id, pid,
            case WHEN listagg(DISTINCT apn_nbr, ';') within GROUP(ORDER BY apn_nbr)= '' THEN 'null'
             ELSE listagg(distinct apn_nbr,',') within group(order by apn_nbr) 
             END as apn_nbr
                 FROM  (SELECT max(f1.pid) as pid,f1.id,apn_nbr,date
                         FROM table_1 f1
                         JOIN table_2 d1
                         ON f1.process_id = d1.process_id
                         WHERE apn_nbr is not null 
                         and id=1234576
                         // AND pid='5812900'
                 GROUP BY id,apn_nbr)
             group by id,pid
 

当我 运行 上述查询时,我得到的结果如下所述:

ID            PID              APN_NBR
220247111   64306012133      228887143,130050106,220247111,220247143
220247111   57558164496      105450046,105450314,136010476,136150077,184060007,186930609

对于一个 ID,我得到 PID 和 APN_NBR 列的不同值。我需要在结果中显示最后的 NOT NULL 记录。

当我尝试使用
QUALIFY rank() over (partition by ID, pid order by datedesc) = 1,我没有得到逗号分隔的 listagg 值。我只得到一条记录(即 APN_NBR 列的第一条记录)

谁能指导我这个逻辑?

提前致谢:)

示例记录:

ID           PID                                                APN_NBR
30247521    5533433057558       130050044,130050106,195050142,960109430,960228707,960542787,960542788
30247521    5533433059643       105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915
34690213    1594308114486       960513957,970020828
34690213    5943081144866   

我只想为每个订单显示一行。即我想为每个订单显示第二行。

请看看这是否有帮助-

Data-set 使用 -

select column1,column2,column3 from
values
(30247521,5533433057558,'130050044,130050106,195050142,960109430,960228707,960542787,960542788'),
(30247521,5533433059643,'105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,97
0010915'),
(34690213,1594308114486,'960513957,970020828'),
(34690213,5943081144866,NULL);
+----------+---------------+-------------------------------------------------------------------------------------------+
|  COLUMN1 |       COLUMN2 | COLUMN3                                                                                   |
|----------+---------------+-------------------------------------------------------------------------------------------|
| 30247521 | 5533433057558 | 130050044,130050106,195050142,960109430,960228707,960542787,960542788                     |
| 30247521 | 5533433059643 | 105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915 |
| 34690213 | 1594308114486 | 960513957,970020828                                                                       |
| 34690213 | 5943081144866 | NULL                                                                                      |
+----------+---------------+-------------------------------------------------------------------------------------------+

查询得到结果 -

select column1,column2,nvl2(column3, column3,lag(column3) over (order by column1))
as column3 from
values
(30247521,5533433057558,'130050044,130050106,195050142,960109430,960228707,960542787,960542788'),
(30247521,5533433059643,'105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,97
0010915'),
(34690213,1594308114486,'960513957,970020828'),
(34690213,5943081144866,NULL) ;
+----------+---------------+-------------------------------------------------------------------------------------------+
|  COLUMN1 |       COLUMN2 | COLUMN3                                                                                   |
|----------+---------------+-------------------------------------------------------------------------------------------|
| 30247521 | 5533433057558 | 130050044,130050106,195050142,960109430,960228707,960542787,960542788                     |
| 30247521 | 5533433059643 | 105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915 |
| 34690213 | 1594308114486 | 960513957,970020828                                                                       |
| 34690213 | 5943081144866 | 960513957,970020828                                                                       |
+----------+---------------+-------------------------------------------------------------------------------------------+

因此,如果您有上次 table 中的数据。

select ID, PID, APN_NBR
from values
    (30247521, 5533433057558, '130050044,130050106,195050142,960109430,960228707,960542787,960542788'),
    (30247521, 5533433059643, '105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915'),
    (34690213, 1594308114486, '960513957,970020828'),
    (34690213, 5943081144866, NULL)
    t(ID, PID, APN_NBR);
ID PID APN_NBR
30247521 5533433057558 130050044,130050106,195050142,960109430,960228707,960542787,960542788
30247521 5533433059643 105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915
34690213 1594308114486 960513957,970020828
34690213 5943081144866 null

并且您希望删除所有带有 APN_NBR 的 NULL 行,然后使用 WHERE 子句消除它们:

select ID, PID, APN_NBR
from values
    (30247521, 5533433057558, '130050044,130050106,195050142,960109430,960228707,960542787,960542788'),
    (30247521, 5533433059643, '105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915'),
    (34690213, 1594308114486, '960513957,970020828'),
    (34690213, 5943081144866, NULL)
    t(ID, PID, APN_NBR)
WHERE APN_NBR IS NOT NULL;

给出:

ID PID APN_NBR
30247521 5533433057558 130050044,130050106,195050142,960109430,960228707,960542787,960542788
30247521 5533433059643 105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915
34690213 1594308114486 960513957,970020828

现在,这些结果可以被 p运行 编辑为每个 ID 唯一的一个结果,并通过 运行 的 QUALIFY 将首选顺序分配给较大的 PID ]s 在 WHERE 子句之后有 运行。你应该在这里使用 ROW_NUMBER 而不是 RANK,虽然我说过你可以使用 RANK,因为如果行相等,RANK 可以有 2 个第一(你可能确实想要)。但另一方面,ROW_NUMBER 将静默选择 1 行,这可能会因执行而异。

select ID, PID, APN_NBR
from values
    (30247521, 5533433057558, '130050044,130050106,195050142,960109430,960228707,960542787,960542788'),
    (30247521, 5533433059643, '105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915'),
    (34690213, 1594308114486, '960513957,970020828'),
    (34690213, 5943081144866, NULL)
    t(ID, PID, APN_NBR)
WHERE APN_NBR IS NOT NULL
QUALIFY row_number() over (partition by ID order by PID desc) = 1;
ID PID APN_NBR
34690213 1594308114486 960513957,970020828
30247521 5533433059643 105450046,105450314,136010476,136150077,184060007,186930609,196051036,960113678,970010915

现在这些可能正是您想要的结果,但这是使用 WHERE 和 QUALIFY/ROW_NUMBER 过滤、排序和限制显示结果的方法。如果您尝试使用小型玩具数据集(如上面提供的),并内化此功能的工作原理。您应该能够将它们应用于您拥有的数据,以及您想要应用的转换。

鉴于您在外部 SELECT 中有一个分组,您可以使用 HAVING 应用 post GROUPING 过滤器,如下所示:

sELECT id, pid,
            case WHEN listagg(DISTINCT apn_nbr, ';') within GROUP(ORDER BY apn_nbr)= '' THEN 'null'
             ELSE listagg(distinct apn_nbr,',') within group(order by apn_nbr) 
             END as apn_nbr
                 FROM  (SELECT max(f1.pid) as pid,f1.id,apn_nbr,date
                         FROM table_1 f1
                         JOIN table_2 d1
                         ON f1.process_id = d1.process_id
                         WHERE apn_nbr is not null 
                         and id=1234576
                         // AND pid='5812900'
                 GROUP BY id,apn_nbr)
             group by id,pid
HAVING APN_NBR IS NOT NULL
QUALIFY row_number() over (partition by ID order by PID desc) = 1;

或者您可以添加另一层选择以应用显示的模式:

SELECT id,pid,apn_nbr FROM(sELECT id, pid,
case WHEN listagg(DISTINCT apn_nbr, ';') 
within GROUP(ORDER BY apn_nbr)= '' THEN 'null'
ELSE listagg(distinct apn_nbr,',') within 
group(order by apn_nbr) END as apn_nbr
FROM(SELECT max(f1.pid) as pid,f1.id,apn_nbr,
date FROM table_1 f1 JOIN table_2 d1 ON 
f1.process_id = d1.process_id WHERE 
apn_nbr is not null and id=1234576
// AND pid='5812900'
GROUP BY id,apn_nbr) group by id,pid)
WHERE APN_NBR IS NOT NULL QUALIFY 
row_number() over (partition by ID order 
by PID desc) = 1;