[英]SQL method to fetch Earliest date
当记录存储在列中时,获取每个客户的销售日期的最佳方法是什么? 每条记录都被扁平化并存储过去 15 年每个月的销售数据。 因此,它包含 Client_ID 和销售月份(Dec_08、Jan_09、Feb_09...)作为列标题,列值包含作为整数的销售值(盒数)。 我需要计算 datediff 以获得自第一次销售以来的年数,因此这里的 Month Year 需要是某种日期答案。 我在雪花中的 SQL 中执行此操作在此处输入图像描述
销售示例如下图所示
任何帮助,将不胜感激。
您可以使用UNPIVOT构造通过将列转换为行来旋转表。
然后计算最小日期(您需要使用 to_date( yourcolumn,'Mon_YY') 将您的月_年值从字符串转换为日期),按 ClientID 分组,其中 box# 不为空。
您还可以应用 datediff 函数来检索最小日期和当前日期之间的时间( https://docs.snowflake.com/en/sql-reference/functions/datediff.html )。
下面是来自 UNPIVOT 构造的 Snowflake 文档的示例 ( https://docs.snowflake.com/en/sql-reference/constructs/unpivot.html )。
给定一个表,monthly_sales,具有以下结构和数据,对各个月份的列进行反透视,以按月返回每个员工的单个销售值:
-- example setup
create or replace table monthly_sales(empid int, dept text, jan int, feb int, mar int, april int);
insert into monthly_sales values
(1, 'electronics', 100, 200, 300, 100),
(2, 'clothes', 100, 300, 150, 200),
(3, 'cars', 200, 400, 100, 50);
-- UNPIVOT example
select * from monthly_sales
unpivot(sales for month in (jan, feb, mar, april))
order by empid;
+-------+-------------+-------+-------+
| EMPID | DEPT | MONTH | SALES |
|-------+-------------+-------+-------|
| 1 | electronics | JAN | 100 |
| 1 | electronics | FEB | 200 |
| 1 | electronics | MAR | 300 |
| 1 | electronics | APRIL | 100 |
| 2 | clothes | JAN | 100 |
| 2 | clothes | FEB | 300 |
| 2 | clothes | MAR | 150 |
| 2 | clothes | APRIL | 200 |
| 3 | cars | JAN | 200 |
| 3 | cars | FEB | 400 |
| 3 | cars | MAR | 100 |
| 3 | cars | APRIL | 50 |
+-------+-------------+-------+-------+
您不能直接使用该数据结构,它太笨拙了。 你必须先把它变成不同的形式。 这样做的方法是引入一个新表并编写一个查询来填充它,如下所示:
insert into YourNewTable
(YearNum, MonthNum, Client_ID, Sale_Value)
select
2008 as Year_Num,
12 as Month_Num,
Client_ID,
Dec_08 as Sale_Value
from
Sale
where
Dec_08 <> 0
union all
select
2009 as Year_Num,
1 as Month_Num,
Client_ID,
Jan_09 as Sale_Value
from
Sale
where
Jan_09 <> 0
union all
[... etc., all the way to the most recent month]
您不能手动编写上面的查询,您必须编写某种自动例程以使用您选择的语言编写查询。 但是一旦完成,它就完成了。
在运行此新查询以填充 YourNewTable 后,您可以以合理的方式查询 YourNewTable。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.