2017-03-06 64 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); 
相關問題