首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Dense Rank with Case When

SQL Dense Rank with Case When
EN

Stack Overflow用户
提问于 2019-08-27 23:08:33
回答 2查看 343关注 0票数 0

我有一个简单的SQL行,它告诉我某个时间范围内的所有订单。我们通过他们的电子邮件来定义客户。

代码语言:javascript
复制
        ,SUM(CASE WHEN T.Order_Status <> 'CANCELLED' AND T.Date_Created BETWEEN '6/02/2019' and '8/02/2019'  THEN 1 ELSE 0 END) over (partition by Email) TotalOrdersNewBase

现在,我想要做的是找到一种方法来获得一定范围内的所有客户。

这一行告诉我整个周期内每个月的所有客户

代码语言:javascript
复制
,DENSE_RANK() over (partition by Date order by Email asc) + DENSE_RANK() over (partition by Date order by Email desc) - 1 as TotalCustomers

但是如何格式化上面的行,使其仅介于6/02和8/02之间呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-28 00:26:18

此代码的目的是统计一段时间内唯一电子邮件的数量。对于总数字,正确的代码是:

代码语言:javascript
复制
(dense_rank() over (order by Email asc) +
 dense_rank() over (order by Email desc) - 1
) as TotalCustomers

在一段时间内,我认为这是可行的:

代码语言:javascript
复制
(dense_rank() over (order by (case when t.Date_Created >= '2019-06-02' and t.date_created < '2019-08-03' then Email end) asc) +
 dense_rank() over (order by (case when t.Date_Created >= '2019-06-02' and t.date_created < '2019-08-03' then Email end) desc) - 1
) as TotalCustomers_in_period

实际上,“思考”有点弱。这是正确的逻辑。唯一关心的是一些边界问题和减去NULL电子邮件(所以在一些边缘情况下可能会有一个off-by-one问题)。

票数 0
EN

Stack Overflow用户

发布于 2019-08-27 23:16:11

下面的语句应该可以工作:

代码语言:javascript
复制
,CASE WHEN Date between '06-01-2002' and '08-31-2002' then DENSE_RANK() over (partition by Date order by Email asc) else 0 end + 
CASE WHEN Date between '06-01-2002' and '08-31-2002' then DENSE_RANK() over (partition by Date order by Email desc) - 1 else 0 end as TotalCustomers

注:我假设日期必须限制在2002年6月和2002年8月之间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57677673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档