我有一个包含2列的CSV文件。
Empid | SID
:-----|-----:
12312 | S-1-5-21-3751615294
12312 | S-1-5-21-3751615298
12312 | S-1-5-21-3751615292
12313 | S-1-5-21-3751615294-5078
13546 | S-1-5-21-3751615294-50725
12312 | S-1-5-21-3751615291
14151 | S-1-5-21-3751615294-50722
对于Empid,有多个SID可用。我需要帮助编写一个sql SELECT查询,它可以将这些SID(已排序)映射(并存储)到多个列中。
所需的SQL Select输出如下: -
+--------+---------------------------+---------------------+--------------------+--------------------+
| Empid | SID1 | SID2 | SID3 | SID4 |
+--------+---------------------------+---------------------+--------------------+--------------------+
| 12312 | S-1-5-21-3751-65291 | S-1-5-21-375165292 | S-1-5-21-375165294 | S-1-5-21-375165298 |
| 12313 | S-1-5-21-3751615294-5078 | NULL | NULL | NULL |
| 13546 | S-1-5-21-3751615294-50725 | NULL | NULL | NULL |
+--------+---------------------------+---------------------+--------------------+--------------------+
我正在从CSV文件中收集应用程序收集器中的员工记录(使用sql select查询),并且需要在他的记录中收集这些SID。最多可以有4个SID,因此我为SID创建了4个属性。
提前致谢。
答案 0 :(得分:1)
据推测,您知道列数。如果是这样,您可以使用条件聚合和row_number()
:
select empid,
max(case when seqnum = 1 then sid end) as sid_1,
max(case when seqnum = 2 then sid end) as sid_2,
max(case when seqnum = 3 then sid end) as sid_3,
max(case when seqnum = 4 then sid end) as sid_4
from (select t.*, row_number() over (partition by empid order by empid) as seqnum
from t
) t
group by empid;
如果你不知道这个号码,那么可能是以逗号分隔的列表:
select empid, listagg(sid, ',') within group (order by sid) as sids
from t
group by empid;
SQL查询具有固定数量的列,因此具有灵活列数的结果集将需要动态SQL。
答案 1 :(得分:1)
您可以使用窗口函数row_number()
将行号分配给每个empid中的sid,然后使用条件聚合来获得最终结果。
select
empid,
min(case when rn = 1 then sid end) sid1,
min(case when rn = 2 then sid end) sid2,
min(case when rn = 3 then sid end) sid3,
min(case when rn = 4 then sid end) sid4
from (select
t.*,
row_number() over (partition by empid order by sid) rn
from table t) group by empid;