我尝试创建一个移动当前三个月的表,使用子查询只选择当前3个月。
我
`select * from dataTable where month in
(select max(month),max(month)-1,max(month)-2 from month_table);`
snowflake返回这个错误消息SQL编译错误:错误行4在位置26无效参数类型函数'=':(NUMBER(6,0), ROW(NUMBER(6,0), NUMBER(7,0), NUMBER(7,0)))
不确定我错过了什么,当我运行查询当前3个月
select max(month),max(month)-1,max(month)-2 from month_table
它确实返回三个月输入图片描述
任何想法?或者任何其他方法来获取移动三个月的数据都是值得赞赏的。
感谢顺便说一句,子查询只在一个月内有效例如:select XXXX from (select max(month) from xxx)所以我现在使用一个笨拙的联合3查询Select XXX from max(month)-1 union Select XXX from max(month)-2…
所以任何更有效的方法都是值得赞赏的。
In子句的子查询需要包含您想要查找的每个值的行。因此,请尝试以下操作:
select * from dataTable where month in
(select max(month) from month_table union all
select max(month)-1 from month_table union all
select max(month)-2 from month_table
);
您所需要做的就是在where子句中放入一个子查询以获得最大值。(可选)根据您的图片创建一些测试数据:
create or replace table dataTable as
select replace(left(dateadd('month', -1 * (row_number() over (order by 1) - 1), '2022-11-01')::string,7), '-', '')::int CALENDAR_YEAR_MONTH
from table(generator(rowcount=>100));
现在只需在where子句中放入一个子查询,以获取结果中需要的月份:
select * from dataTable
where CALENDAR_YEAR_MONTH > (select max(CALENDAR_YEAR_MONTH) - 3 from dataTable)
;
使用IN
时:
where month in
(select max(month),max(month)-1,max(month)-2 from month_table)
你正在尝试执行:
WHERE (col) IN ((val1, val2, val3))
和定义上的单元素不能等于三元素元组
:
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )
value_A, value_B
要搜索的行构造函数的元素。
确保IN右边的每个值(例如(value3, value4))与IN左边的值(例如(value_A, value_B))具有相同的元素个数。
要使其工作,查询应该组织为匹配:
WHERE (col) IN ((val1), (val2), (val3))
。
WHERE month IN (SELECT max(month) FROM month_table UNION
SELECT max(month)-1 FROM month_table UNION
SELECT max(month)-2 FROM month_table)
或更简单的
WHERE month BETWEEN (SELECT max(month)-2 FROM month_table)
AND (SELECT max(month) FROM month_table)
如何使用变量?这样你就可以将这些月份作为列表传递
set (m0,m1,m2) = (select max(month),max(month)-1,max(month)-2 from month_table);
select *
from dataTable
where month in ($m0,$m1,$m2);
我的第一个问题是,你有日期作为以太字符串或数字,然后在他们做整数数学,似乎期望你会得到有效的结果:
这里我列出了一年的日期,然后将它们转换为您拥有的相同的yyyymm
数字格式,然后减去2,&就像你做的一样,但也要用减法显示日期是什么。这些都表明你的代理是非常危险的。
select
column1::date as as_date
,to_char(as_date, 'yyyymm')::int as_num
,as_num -2 as minus_2
,as_num -3 as minus_3
,dateadd('month', -3, as_date) as date_minus_3
from values
('2022-12-01'),('2022-11-01'),
('2022-10-01'),('2022-09-01'),
('2022-08-01'),('2022-07-01'),
('2022-06-01'),('2022-05-01'),
('2022-04-01'),('2022-03-01'),
('2022-02-01'),('2022-01-01'),
('2021-12-01')
order by 1 desc;
给:
正如大多数注释所指出的那样,您的查询以行而不是列的形式返回数据,这导致了错误消息。
如果月份的格式是正确的,比如number,那么试试这个。(我觉得这可能是最简洁的代码)
select * from dataTable where MONTH in (select distinct top 3 month from month_table DESC)