如何在db2或sql中对数据进行分组生成一系列数字

du7egjpx  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(292)

我有如下数据
| 管理员|城市名称|建筑物|楼层|座位数|
| - -|- -|- -|- -|- -|
| xxx|最大似然比|SA 2型|二层|2个|
| 某某|最大似然比|SA 2型|二层|三个|
| 夏|最大似然比|SA 2型|三层|2个|
| xjk公司|最大似然比|SA 2型|三层|一个|
生成的数据应如下图,按经理或楼栋和楼层分组,需要根据座位数生成级数。
| 管理员|城市名称|建筑物|楼层|座位数|
| - -|- -|- -|- -|- -|
| xxx|最大似然比|SA 2型|二层|一个|
| xxx|最大似然比|SA 2型|二层|2个|
| 某某|最大似然比|SA 2型|二层|三个|
| 某某|最大似然比|SA 2型|二层|四个|
| 某某|最大似然比|SA 2型|二层|五个|
| 夏|最大似然比|SA 2型|三层|一个|
| 夏|最大似然比|SA 2型|三层|2个|
| xjk公司|最大似然比|SA 2型|三层|三个|

byqmnocz

byqmnocz1#

下面的解决方案不依赖于最大座位数。

WITH 
/*
  MYTAB (Manager, City, Building, Floor, Number_of_Seats) AS
(
VALUES
  ('xxx', 'BLR', 'SA2', '2F', 2)
, ('xyz', 'BLR', 'SA2', '2F', 3)
, ('xya', 'BLR', 'SA2', '3F', 2)
, ('xjk', 'BLR', 'SA2', '3F', 1)
)
, 

* /

  T (Manager, City, Building, Floor, Number_of_Seats) AS 
(  
SELECT Manager, City, Building, Floor, Number_of_Seats 
FROM MYTAB
    UNION ALL
SELECT Manager, City, Building, Floor, Number_of_Seats - 1
FROM T
WHERE Number_of_Seats > 1
)
SELECT 
  Manager, City, Building, Floor
, ROW_NUMBER () OVER (PARTITION BY City, Building, Floor ORDER BY Manager) AS Number_of_Seats
FROM T
ORDER BY City, Building, Floor, Manager

如果取消注解committed out块并按原样运行该语句,则会得到以下输出。
| 经理人|所在城市|建筑物|地板|座位数|
| - -|- -|- -|- -|- -|
| xxx|最大似然比|SA 2型|二层|一个|
| xxx|最大似然比|SA 2型|二层|2个|
| 某某|最大似然比|SA 2型|二层|三个|
| 某某|最大似然比|SA 2型|二层|四个|
| 某某|最大似然比|SA 2型|二层|五个|
| xjk公司|最大似然比|SA 2型|三层|一个|
| 夏|最大似然比|SA 2型|三层|2个|
| 夏|最大似然比|SA 2型|三层|三个|

tzxcd3kk

tzxcd3kk2#

您可以按座位数对产品进行carterisan,然后按经理ID对其进行订购。
以下是一种实现此目的的方法

with row_gen(rn) as (
        select 1 from SYSIBM.SYSDUMMY1    
        union all
        select rn+ 1 from dummy where id < 10000 /*assumption that the number of seats isnt more than 10000*/
    )
    ,data
    as (
    select tb.mgr,tb.city,tb.bldg,tb.floor,rg.rn
      from row_gen rg
      join table tb
        on tb.no_of_seats<=rg.rn
        )
select d.mgr,d.city,d.bldg,d.floor
      ,row_number() over(partition by d.city,d.bldg,d.floor order by d.mgr) as no_of_seats
  from data d
vptzau2j

vptzau2j3#

with row_gen(rn) as (

  SELECT 1 AS rn FROM SYSIBM.SYSDUMMY1 
    UNION ALL
    SELECT rn+1  FROM row_gen WHERE rn+ 1 <=50
    ) 
    ,data
    as (
    select tb.manager,tb.location,tb.building,tb.floor,rg.rn
      from row_gen rg
      join db2inst1.tmp_cio_data tb
        on  rg.rn <= tb.seat_range_to
        )
select d.manager,d.location,d.building,d.floor,
     row_number() over(partition by d.location,d.building,d.floor order by d.manager) as no_of_seats
  from data d WHERE d.floor = 11 AND d.building = '12D'

相关问题