如何解决有什么方法可以根据月份填充实体,但不包括每个循环的第一个月?
我有一组这样的数据样本
| id | month
| x | jan
| x | feb
| x | mar
有什么办法可以使我的样本像这样吗?
| id | month | number
| x | jan | 1
| x | feb | 2
| x | mar | 3
| x | feb | 1
| x | mar | 2
| x | mar | 1
除了所有循环的第一个月之外,这都像工会一样工作
解决方法
以下是用于BigQuery标准SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id,'jan' month,1 pos UNION ALL
SELECT 1,'feb',2 UNION ALL
SELECT 1,'mar',3
)
SELECT id,month,pos - MIN(pos) OVER(PARTITION BY id,num) + 1 AS number
FROM `project.dataset.table`,UNNEST(GENERATE_ARRAY(1,pos)) AS num
-- ORDER BY num
有输出
Row id month number
1 1 jan 1
2 1 feb 2
3 1 mar 3
4 1 feb 1
5 1 mar 2
6 1 mar 1
如果pos
字段不明确可用-您可以按照以下示例进行导出
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id,'jan' month UNION ALL
SELECT 1,'feb' UNION ALL
SELECT 1,'mar'
),temp AS (
SELECT id,EXTRACT(MONTH FROM PARSE_DATE('%b',month)) pos
FROM `project.dataset.table`
)
SELECT id,num) + 1 AS number
FROM temp,pos)) AS num
-- ORDER BY num
具有相同的最终输出
,如果表名是sample,则可以尝试以下递归CTE:
WITH cte AS
(
SELECT id,ROW_NUMBER() OVER (ORDER BY id,month) number
FROM samples
union ALL
SELECT id,nr-1
FROM cte
where nr>1
)
SELECT
id,number
FROM cte
首先,我们使用ROW_NUMBER()对行进行编号,然后使用递归CTE首先返回所有行,然后返回行号> 1的alle行,将行号减少1,这将运行相同的迭代次数作为原始行数。
,with data as (
select id,"month",case "month"
when 'jan' then 1 when 'feb' then 2 when 'mar' then 3 when 'apr' then 4
when 'may' then 5 when 'jun' then 6 when 'jul' then 7 when 'aug' then 8
when 'sep' then 9 when 'oct' then 10 when 'nov' then 11 when 'dec' then 12
end as mm
from T
)
select d1.id,d1."month",row_number() over (partition by d1.id order by d1.mm) as nun
from data d1 cross apply data d2
where d1.mm <= d2.mm
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。