[英]SQL modeling question Window function [ROW_NUMBER() OVER (ORDER BY )] appears outside of SELECT, QUALIFY, and ORDER BY clauses
我有一张名为玩具的表格,它给出了给定名称的给定日期的玩具总数。 我想显示每天的玩具总数
这是架构:
create schema test_models
create table toys
(
name varchar(10),
number_toys int,
created_at timestamp
);
表中数据:
insert into toys
values ('M', 5, '2021-11-11T00:00:00.000Z'),
('M', 10, '2021-11-12T00:00:00.000Z'),
('M', 15, '2021-11-13T00:00:00.000Z'),
('N', 4, '2021-11-11T00:00:00.000Z'),
('N', 8, '2021-11-12T00:00:00.000Z'),
('N', 12, '2021-11-13T00:00:00.000Z');
此查询返回给定日期的玩具数量:
select sum(count)
from
(select distinct
name,
last_value(number_toys) over (partition by name order by created_at asc) as count
from toys
where created_at <= '2021-11-12T00:00:00.000Z')
创建了一个 UDF 以在每一行中调用:
create or replace function count_toys
(end_date_time VARCHAR(25))
returns number(30,0)
as
$$
select sum(count)
from
(select distinct
name,
last_value(number_toys) over (partition by name
order by created_at asc) as count
from toys
where created_at <= end_date_time)
$$
此查询正在调用 UDF:
select
row_number() over (order by null) as row_number,
dateadd(day, row_number - 1, '2021-11-11T00:00:00.000Z') start_date_time,
dateadd(day, 1, start_date_time) as end_date_time,
count_toys(end_date_time)
from
table (generator(rowcount => 3))
order by
start_date_time
但是当我使用 UDF 运行上述查询时出现此错误,我在这里做错了什么。 如果
SQL compilation error: Window function [ROW_NUMBER() OVER (ORDER BY null ASC NULLS LAST)] appears outside of SELECT, QUALIFY, and ORDER BY clauses
我不知道为什么你必须为此目的使用窗口 function,下面的查询可以得到你想要的吗?
SELECT created_at, sum(number_toys)
FROM toys
GROUP BY created_at;
+-------------------------------+------------------+
| CREATED_AT | SUM(NUMBER_TOYS) |
|-------------------------------+------------------|
| 2021-11-11 00:00:00.000000000 | 9 |
| 2021-11-12 00:00:00.000000000 | 18 |
| 2021-11-13 00:00:00.000000000 | 27 |
+-------------------------------+------------------+
据我了解,您生成日期,并且您希望查看所有这些日期的玩具总数的一些值,即使玩具表中没有相应的值。 这是一个示例 SQL :
with timestamps as (
select
dateadd(day, row_number() over (order by null) - 1, '2021-11-11' )::DATE report_date
from table (generator(rowcount => 4))
),
totals as (
select created_at::date as created_date, sum(number_toys) total
from toys
group by created_date
)
select ts.report_date, IFNULL(t.total, lag(t.total) over (order by ts.report_date)) total
from timestamps ts
left join totals t on ts.report_date = t.created_date
order by ts.report_date;
+-------------+-------+
| REPORT_DATE | TOTAL |
+-------------+-------+
| 2021-11-11 | 9 |
| 2021-11-12 | 18 |
| 2021-11-13 | 27 |
| 2021-11-14 | 27 |
+-------------+-------+
如您所见,即使没有 14-11 的数据,您仍然可以看到玩具总数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.