繁体   English   中英

获取最早日期的SQL方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM