首页 > 解决方案 > 获取最早日期的 SQL 方法

问题描述

当记录存储在列中时,为每个客户获取销售日期的最佳方法是什么?每条记录都被展平并存储过去 15 年每个月的销售数据。因此,它包含 Client_ID 和销售月份(Dec_08、Jan_09、Feb_09...)作为列标题,列值包含作为整数的销售值(盒子数)。我需要计算 datediff 以获得自第一次销售以来的年数,因此 Month Year 需要在这里作为某种日期答案。我在 Snowflake 中的 SQL 中执行此操作 在 此处输入图像描述

销售示例如下图所示

任何帮助,将不胜感激。

标签: sqlsnowflake-cloud-data-platform

解决方案


您可以使用UNPIVOT构造通过将列转换为行来旋转表。

然后计算最小日期(您需要使用 to_date(yourcolumn,'Mon_YY') 将 month_year 值从字符串转换为日期),按 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 |
+-------+-------------+-------+-------+

推荐阅读