SQL子查询,其中in不工作(在snowflake)



我尝试创建一个移动当前三个月的表,使用子查询只选择当前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)
;
CALENDAR_YEAR_MONTH202211202210202209

使用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;

给:

<表类>AS_DATEAS_NUMMINUS_2MINUS_3DATE_MINUS_3tbody><<tr>2022-12-012022122022102022092022-09-012022-11-012022112022092022082022-08-012022-10-012022102022082022072022-07-012022-09-012022092022072022062022-06-012022-08-012022082022062022052022-05-012022-07-012022072022052022042022-04-012022-06-012022062022042022032022-03-012022-05-012022052022032022022022-02-012022-04-012022042022022022012022-01-012022-03-012022032022012022002021-12-012022-02-012022022022002021992021-11-012022-01-012022012021992021982021-10-012021-12-012021122021102021092021-09-01

正如大多数注释所指出的那样,您的查询以行而不是列的形式返回数据,这导致了错误消息。

如果月份的格式是正确的,比如number,那么试试这个。(我觉得这可能是最简洁的代码)

select * from dataTable where MONTH in (select distinct top 3 month from month_table DESC)

相关内容

  • 没有找到相关文章

最新更新