2017-03-06 66 views
0

我发现很多代码让sql显示一个月的第一个月,但我需要根据我的数据集显示一个月的第一天不只是[month] 1st [year]SQL查找数据集的月份的第一天

EX 1:1月1日是假期,所以它不会是数据集中月份的第一天,1月1日的第一天是1月2日。 另一个例子是,如果这个月的第一个日期是我的数据集中的第7个,我想看到第7个不是第1个。

这是我的数据集

DATE 
---------- 
2016-02-01 
2016-02-05 
2016-02-08 
2016-02-19 
2016-02-20 
2016-02-22 
2016-05-02 
2016-05-05 
2016-05-07 
2016-05-09 
2016-05-11 
2016-05-23 
2016-06-01  
2016-06-10 
2016-06-20 
2016-06-29 
2016-07-01 
2016-07-07 
2016-07-14 
2016-07-21 
2016-07-28 
2016-07-31 
2016-08-04 
2016-08-10 
2016-08-18 
2017-02-23 
2017-02-30 

我需要这显示

DATE 
---------- 
2016-02-01 
2016-05-02 
2016-06-01  
2016-07-01 
2016-08-04 
2017-02-23 

我一直卡住,我认为这可以工作,但我没有收到最小日期为一个月

select min(load_date) from multi_dt 
group by month(load_date) 

回答

0

你的初步答案很好,你还需要按年分组。

group by 
month(load_date),year(load_date) 
1

试试这个:

select min(load_date) as min_load_date 
from multi_dt 
group by dateadd(month, datediff(month, 0, load_date) , 0) 

使用month()仅返回月份,但在上面的查询中使用该函数将返回该月份的第一个月份,但作为datetime数据类型,因此按照它进行分组时,它将包括年份和月份。

rextester演示:http://rextester.com/UJRN68337

回报:

+---------------+ 
| min_load_date | 
+---------------+ 
| 2016-02-01 | 
| 2016-05-02 | 
| 2016-06-01 | 
| 2016-07-01 | 
| 2016-08-04 | 
| 2017-02-23 | 
+---------------+ 
0

我会用row_number()

select t.date 
from (select t.*, 
      row_number() over (partition by year(date), month(date) order by date) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

如果你不需要任何额外的列,聚合是等价的:

select min(t.date) 
from t 
group by year(t.date), month(t.date); 
相关问题