繁体   English   中英

SQL modeling question Window function [ROW_NUMBER() OVER (ORDER BY )] appears outside of SELECT, QUALIFY, and ORDER BY clauses

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM