-1

这是我表中的一些示例数据:

day_number  daily_users_count
1           1
3           1
6           1
7           1
9           2
10          2

我需要从 1 到 max(day_number) 的所有 day_number 值,如果此表中未提及,我希望 daily_users_count 为零。

它应该看起来像这样:

day_number  daily_users_count
1           1
2           0
3           1
4           0
5           0
6           1
7           1
8           0
9           2
10          2

我认为,如果我将 daily_users_count 的默认值设置为 0,则左连接与表的数字列具有从 1 到 max(day_number) 的所有整数。

我没有得到的是如何创建这样一个表,其中存在一定范围内的所有整数。任何替代解决方案或任何方法将不胜感激。

4

1 回答 1

1

您可以使用递归来执行此操作,该递归CTE将返回所有day_numbers,包括缺少的 s,然后LEFT加入到表中:

with cte as (
  select min(day_number) day_number from tablename
  union all
  select day_number + 1 from cte
  where day_number < (select max(day_number) from tablename)
)  
select c.day_number, 
       coalesce(t.daily_users_count, 0) daily_users_count
from cte c left join tablename t
on t.day_number = c.day_number

请参阅演示
结果:

| day_number | daily_users_count |
| ---------- | ----------------- |
| 1          | 1                 |
| 2          | 0                 |
| 3          | 1                 |
| 4          | 0                 |
| 5          | 0                 |
| 6          | 1                 |
| 7          | 1                 |
| 8          | 0                 |
| 9          | 2                 |
| 10         | 2                 |
于 2020-08-29T09:30:26.167 回答