我嘗試通過使用僅選擇當前 3 個月的子查詢來創建一個移動當前三個月的表。
我有
`select * from dataTable where month in
(select max(month),max(month)-1,max(month)-2 from month_table);`
snowflake 向我回傳此錯誤訊息 SQL 編譯錯誤:位置 26 處的錯誤行 4 函式 '=' 的引數型別無效:(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) union select xxx from max(month)-1 union 從 max(month)-2 中選擇 xxx ...
因此,任何更好的有效方法都是值得贊賞的。
uj5u.com熱心網友回復:
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
);
uj5u.com熱心網友回復:
您需要做的就是在您的 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_MONTH |
|---|
| 202211 |
| 202210 |
| 202209 |
uj5u.com熱心網友回復:
使用時IN:
where month in
(select max(month),max(month)-1,max(month)-2 from month_table)
你正在嘗試執行:
WHERE (col) IN ((val1, val2, val3))
并且根據定義,單個元素不能等于 3 元素元組。
在:
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )值_A,值_B
要搜索的行建構式的元素。
確保 IN 右側的每個值(例如 (value3, value4))與 IN 左側的值(例如 (value_A, value_B))具有相同數量的元素。
為了使其作業,應該組織查詢以匹配:
WHERE (col) IN ((val1), (val2), (val3))
IE,
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)
uj5u.com熱心網友回復:
如何使用變數?這樣你就可以將那些月份作為串列傳遞
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);
uj5u.com熱心網友回復:
我首先擔心的是,您將日期作為以太字串或數字,然后對它們進行整數數學運算,并且似乎期望您會得到有效結果:
在這里,我列出了一年的日期,然后將它們轉換為yyyymm您擁有的相同數字格式,然后像您一樣減去 2 和 3,但也顯示減去的日期是什么。這一切都表明你所擁有的代表是非常危險的。
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_DATE | AS_NUM | MINUS_2 | MINUS_3 | DATE_MINUS_3 |
|---|---|---|---|---|
| 2022-12-01 | 202212 | 202210 | 202209 | 2022-09-01 |
| 2022-11-01 | 202211 | 202209 | 202208 | 2022-08-01 |
| 2022-10-01 | 202210 | 202208 | 202207 | 2022-07-01 |
| 2022-09-01 | 202209 | 202207 | 202206 | 2022-06-01 |
| 2022-08-01 | 202208 | 202206 | 202205 | 2022-05-01 |
| 2022-07-01 | 202207 | 202205 | 202204 | 2022-04-01 |
| 2022-06-01 | 202206 | 202204 | 202203 | 2022-03-01 |
| 2022-05-01 | 202205 | 202203 | 202202 | 2022-02-01 |
| 2022-04-01 | 202204 | 202202 | 202201 | 2022-01-01 |
| 2022-03-01 | 202203 | 202201 | 202200 | 2021-12-01 |
| 2022-02-01 | 202202 | 202200 | 202199 | 2021-11-01 |
| 2022-01-01 | 202201 | 202199 | 202198 | 2021-10-01 |
| 2021-12-01 | 202112 | 202110 | 202109 | 2021-09-01 |
請注意Jan 2022減號3不是Nov 202199th month of 2021
鑒于需要執行多個子查詢和值范圍,我總是會使用 Lukasz 最后顯示的 BETWEEN 版本(因為 BETWEEN 明確說明了您的意圖)
WHERE month BETWEEN (SELECT to_char(dateadd('month', -3, to_date(max(month)::text,'YYYYMM')), 'yyyymm')::int FROM month_table)
AND (SELECT max(month) FROM month_table)
但你可以移動數學,從a between x-2 and x到 x 到x between a-2 and athus
WHERE (SELECT max(month) FROM month_table) BETWEEN to_char(dateadd('month', -3, to_date(month::text,'YYYYMM')), 'yyyymm')::int
AND month
以上假設month是一個基于 -1 和 -2 的 int
我也會用別名來寫,這樣就清楚了:
select *
from dataTable as d
where (select max(m.month) from month_table as m) between to_char(dateadd('month', -3, to_date(d.month::text,'YYYYMM')), 'yyyymm')::int
AND d.month
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536647.html
標籤:数据库雪花云数据平台
下一篇:如何在存盤程序中生成多行?
