hive 我需要为一年中的每个月向行中添加数据

xzabzqsa  于 2022-11-05  发布在  Hive
关注(0)|答案(1)|浏览(242)

我有一个表,其中每个位置都有一个不同计费代码下的交易,如果在一年中的某个特定月份有一个计费代码下的交易,并且如果计费代码在下个月停止使用,则最终交易表应包含新的计费代码以及未来12个月的停止使用的计费代码(YTD交易)
输入表如下所示
| 年份|位置ID|月份|发票ID|代码|金额1|本年累计金额|
| - -|- -|- -|- -|- -|- -|- -|
| 小行星2021|小行星6394|一个|一百零一|F级|一个|一个|
| 小行星2021|小行星6394|一个|一百零一|G级|10个|10个|
| 小行星2021|小行星6394| 2个|一百零二|F级|2个|三个|
| 小行星2021|小行星6394|三个|一百零三|F级|三个|六个|
| 小行星2021|小行星6394|四个|一百零四|F级|四个|10个|
| 小行星2021|小行星6394|五个|一百零五|F级|五个|十五个|
| 小行星2021|小行星6394|六个|一百零六个|F级|2个|十七岁|
| 小行星2021|小行星6394|六个|一百零六个|G级|一个|十一|
| 小行星2021|小行星6394|七个|一百零七|F级|2个|十九个|
| 小行星2021|小行星6394|八个|一百零八|F级|三个|二十二个|
| 小行星2021|小行星6394|九个|一百零九|F级|一个|二十三个|
| 小行星2021|小行星6394| 10个|小千十|F级|2个|二十五个|
| 小行星2021|小行星6394|十一|小行星10| F级|一个|二十六人|
| 小行星2021|小行星6394|十二个|小行星10| F级|三个|二十九人|
我的预期输出是
| 年份|位置ID|月份|发票ID|代码|金额1|本年累计金额|
| - -|- -|- -|- -|- -|- -|- -|
| 小行星2021|小行星6394|一个|一百零一|F级|一个|一个|
| 小行星2021|小行星6394|一个|一百零一|G级|10个|10个|
| 小行星2021|小行星6394| 2个|一百零二|F级|2个|三个|
| 小行星2021|小行星6394| 2个|一百零二|G级|第0页|10个|
| 小行星2021|小行星6394|三个|一百零三|F级|三个|六个|
| 小行星2021|小行星6394|三个|一百零三|G级|第0页|10个|
| 小行星2021|小行星6394|四个|一百零四|F级|四个|10个|
| 小行星2021|小行星6394|四个|一百零四|G级|第0页|10个|
| 小行星2021|小行星6394|五个|一百零五|F级|五个|十五个|
| 小行星2021|小行星6394|五个|一百零五|G级|第0页|10个|
| 小行星2021|小行星6394|六个|一百零六个|F级|2个|十七岁|
| 小行星2021|小行星6394|六个|一百零六个|G级|一个|十一|
| 小行星2021|小行星6394|七个|一百零七|F级|2个|十九个|
| 小行星2021|小行星6394|七个|一百零七|G级|第0页|十一|
| 小行星2021|小行星6394|八个|一百零八|F级|三个|二十二个|
| 小行星2021|小行星6394|八个|一百零八|G级|第0页|十一|
| 小行星2021|小行星6394|九个|一百零九|F级|一个|二十三个|
| 小行星2021|小行星6394|九个|一百零九|G级|第0页|十一|
| 小行星2021|小行星6394| 10个|小千十|F级|2个|二十五个|
| 小行星2021|小行星6394| 10个|小千十|G级|第0页|十一|
| 小行星2021|小行星6394|十一|小行星10| F级|一个|二十六人|
| 小行星2021|小行星6394|十一|小行星10| G级|第0页|十一|
| 小行星2021|小行星6394|十二个|小行星10| F级|三个|二十九人|
| 小行星2021|小行星6394|十二个|小行星10| G级|第0页|十一|
我试过这个

WITH temp1 AS
(select   year,invoiceID,locationID,count(1)
FROM     InputTable
GROUP BY year, invoiceID,ocationID HAVING   count(1)=1)
,
temp2 AS
(  SELECT *  FROM   InputTable
  WHERE  concat(year,'_',invoiceID,'_',locationID) in 
      (  SELECT   concat(b.year, '_',b.invoiceID,'_',b.locationID)  FROM    InputTable b
                   GROUP BY b.year,  b.invoiceID, b.locationID
                   HAVING   count (1)>1 
      ) 
) 
SELECT DISTINCT 
  c.year,
                CASE  WHEN c.code=d.code THEN c.post_date_month  ELSE c.post_date_month END AS post_date_month,
                c.invoiceID,
                CASE WHEN c.code=d.code THEN c.locationID  ELSE d.locationID END AS locationID,
                CASE WHEN c.code=d.code THEN c.code  ELSE d.code END AS code,
                CASE  WHEN c.code=d.code THEN c.base_amount ELSE d.base_amount END AS base_amount,
                CASE  WHEN c.code=d.code THEN c.base_amount_ytd  ELSE d.base_amount_ytd  END AS base_amount_ytd
FROM            (
                                SELECT DISTINCT b.*
                                FROM            temp1 a
                                INNER JOIN      InputTable b
                                ON              a.year=b.year   AND  a.invoiceID=b.invoiceID AND a.locationID=b.locationID
                ) c
LEFT JOIN       temp2 d
ON              1=1
;
46qrfjad

46qrfjad1#

首先,您需要在构建“新”行的cte中COUNT(*)为1的所有行,并将其与现有行联合。
根据您的示例,我已经构建了CTE,它符合您的数据,但您需要使CTE适应您的需求

WITH CTE AS (
    SELECT
        Year,   LocationID,     Month,  invoiceID, 'G',0,
        CASE WHEN "amt ytd" > 10 THEN 11 ELSE 10 END
    FROM InputTable
    GROUP BY Year,  LocationID,     Month,invoiceID
    HAVING COUNT(*) = 1)
SELECT * FROM InputTable
UNION 
SELECT * FROM CTE
ORDER BY Year,  LocationID,     Month,  invoiceID

相关问题