where子句中的case语句



我正在尝试创建一个where语句,该语句考虑一周中的哪一天,然后根据它进行筛选。例如,如果我提取数据的日期是周三,我只想提取该周的周一至周三的数据。如果是星期五,那么星期一-星期五,以此类推

我试着在where子句中使用一个case来做这件事,但我无法使它发挥作用。

select 
uuid,
acquisition_campaign,
REFERRAL_PROMO,
channel,
partner,
created_at::date as created_date
from CONSUMER_TMP
where created_date between case DAYOFWEEK(getdate())
when 0 then (getdate()::date) and (getdate()::date)
when 1 then (DATEADD('day', -1, getdate())) and (getdate())
when 2 then (DATEADD('day', -2, getdate())) and (getdate())
when 3 then (DATEADD('day', -3, getdate())) and (getdate())
when 4 then (DATEADD('day', -4, getdate())) and (getdate())
when 5 then (DATEADD('day', -5, getdate())) and (getdate())
when 6 then (DATEADD('day', -6, getdate())) and (getdate())
else (DATEADD('day', -7, getdate())) and (getdate())
end

我没有测试它,但我认为这会起作用。

一个问题是不能在where子句中使用自定义列名,所以首先必须将其更改为实际列名。其次,您需要更改查询中的and,如下所示:

where created_at::date between case DAYOFWEEK(getdate())
when 0 then (getdate()::date)
when 1 then (DATEADD('day', -1, getdate()))
when 2 then (DATEADD('day', -2, getdate()))
when 3 then (DATEADD('day', -3, getdate()))
when 4 then (DATEADD('day', -4, getdate()))
when 5 then (DATEADD('day', -5, getdate()))
when 6 then (DATEADD('day', -6, getdate()))
else (DATEADD('day', -7, getdate()))
end and (getdate())

因为您的案例中的and需要像between something and other_thing一样位于case之外,例如,当DAYOFWEEK(getdate())为0时,它会检查created_date between (getdate()::date) and (getdate())是否存在,依此类推


编辑:

正如@Simeon Pilgrim在评论中所说,您可以在雪花中使用select中的列名。

我认为你甚至可以进一步简化你的查询,你根本不需要case,你可以这样做:

where created_date between (DATEADD('day',-(DAYOFWEEK(getdate())),getdate())) and (getdate())

因此,如果星期几是0,它将返回between getdate() and getdate(),因为加上-0天会增加0天,如果是1,它将恢复between getdate() - 1 and getdate(),依此类推

查询的另一个问题是else (DATEADD('day', -7, getdate())),我相信你可以删除这个else并将其添加到不同的日期,因为dayofweek()只能返回7个值,(0-6),所以你可以为其他任何一天添加其他值,而不是为当天添加when then,所以如果我以前的建议不起作用(我不知道为什么不应该),你可以用这个建议来简化它。

要做的第一点是,您的case语句正在截断到本周的开始,所以您应该只执行DATE_TRUNC

此代码获取一些天数,并与它们一起显示自联接天数的输入或输出,即显示您的current_date()d1如何相同

with data(date) as (
select 
to_date(column1, 'mm-dd-yyyy')
from values
('07-10-2022'),
('07-11-2022'),
('07-12-2022'),
('07-13-2022'),
('07-14-2022'),
('07-15-2022')
)
select d1.date as d1
,d2.date as d2
,dayname(d1) as day_name
,DAYOFWEEK(d1) as day_of_week
,date_trunc('week', d1) as trunc_d1
,d2 between trunc_d1 and d1 as in_range
from data as d1
cross join data as d2
order by 1;
>DAY_OF_WEEKTRUNC_D1IN_RANGE002022:07-04错误周日2022-07-04周日2022-07-04错误周日2022-07-04太阳2022-07-04真<2022-07-11><2022-07-11><2022-07-11>周一周一周二错误周二<2022-07-11>//tr>周二<2022-07-11>//tr>周二<2022-07-11>//tr>周二<2022-07-11>//tr>周二<2022-07-11>//tr>周三错误周三错误周三错误周三周三<2022-07-11><2022-07-11>//tr>//tr>//tr><2022-07-11><2022-07-11><2022-07-11>//tr>2022:07-11<2022-07-11>真<2022-07-11>真<2022-07-11>真真
D1D2DAY_NAME
2022-07-102022-07-11太阳2022:07-04错误
2022-07-102022-07-12太阳
2022-07-102022-07-130错误
2022-07-102022-07-140
2022-07-102022-07-150错误
2022-07-102022-07-100
2022-07-112022-07-14周一1错误
2022-07-112022-07-15周一1错误
2022-07-112022-07-13周一1错误
2022-07-112022-07-12周一202207-11错误
2022-07-112022-07-11122022-07-11
2022-07-112022-07-10122022-07-11错误
2022-07-122022-07-1022022-07-11
2022-07-122022-07-11
2022-07-122022-07-12
2022-07-122022-07-13错误
2022-07-122022-07-14错误
2022-07-122022-07-15错误
2022-07-132022-07-102022-07-11
2022-07-132022-07-152022-07-11
2022-07-132022-07-142022-07-11
2022-07-132022-07-132022-07-11
2022-07-132022-07-122022-07-11
2022-07-132022-07-11周三
2022-07-142022-07-10周四错误
2022-07-142022-07-11周四2022-07-11
2022-07-142022-07-12周四202207-11
2022-07-142022-07-13周四202207-11
2022-07-142022-07-14周四
2022-07-142022-07-15周四错误
2022-07-152022-07-10周五错误
2022-07-152022-07-11周五5TRUE
2022-07-152022-07-12周五5
2022-07-152022-07-13周五5
2022-07-152022-07-14周五5
2022-07-152022-07-15周五5202207-11

上面的更正将修复与BETWEEN一起使用的case语句,但在遵循所需结果时,我认为星期几的逻辑可能存在问题,特别是如果打算在星期一使用的话->只要是一周内的今天。

值得注意的是,请检查您的周初设置,因为它可能不会在此处为周初返回0。https://docs.snowflake.com/en/sql-reference/functions-date-time.html#first-

我创建了一个测试用例,并对其进行了测试——它似乎按照上面描述的所需逻辑工作:

create
or replace table testdata (
create_date date,
c2 varchar,
c1 int default dayofweekiso(create_date)
);
insert into
testdata (create_date, c2)
values
(to_date('07-10-2022', 'mm-dd-yyyy'),'Sunday'),
(to_date('07-11-2022', 'mm-dd-yyyy'),'Monday'),
(to_date('07-12-2022', 'mm-dd-yyyy'), 'Tuesday'),
(to_date('07-13-2022', 'mm-dd-yyyy'), 'Wednesday'),
(to_date('07-14-2022', 'mm-dd-yyyy'),'Thursday'),
(to_date('07-15-2022', 'mm-dd-yyyy'),'Friday');
select
current_date(),
dayofweek(current_date()),
dayofweekiso(current_date),
create_date
from
testdata
where
(
dayofweekiso(create_date) = dayofweekiso(current_date())
and create_date = current_date()
)
or create_date between case
dayofweekiso(current_date())
when 2 then (DATEADD('day', -1, current_date()))
when 3 then (DATEADD('day', -2, current_date()))
when 4 then (DATEADD('day', -3, current_date()))
when 5 then (DATEADD('day', -4, current_date()))
when 6 then (DATEADD('day', -5, current_date()))
when 7 then (DATEADD('day', -6, current_date()))
end
and current_date();

这只是周二,我预计只会在周一和周二的结果中看到数据:

CURRENT_DATE
2022-07-1222022-07-11
2022-07-122222022-07-12

相关内容

  • 没有找到相关文章

最新更新