2017-03-06 5 views
0

Ich habe viel Code gefunden, damit der SQL den Ersten eines Monats anzeigt, aber ich muss den ersten Tag des Monats basierend auf meinem Datensatz anzeigen nicht nur [month] 1st [year]SQL Den ersten Tag des Monats eines Datensatzes finden

EX 1: 1. Januar ist ein Feiertag, also wird es nie der erste Tag des Monats im Datensatz sein, der erste Tag des Januars ist der 2. Januar. Ein anderes Beispiel ist, wenn das erste Datum des Monats das 7. in meinem Datensatz ist, möchte ich das 7. nicht das 1. sehen.

Das ist mein Datensatz

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 

Ich brauche diese

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

steckte ich werde immer angezeigt werden, dachte ich dies funktionieren kann, aber ich bin nicht immer die min Datum für diesen Monat

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

Antwort

0

Ihre erste Antwort war in Ordnung, Sie mussten auch nur nach dem Jahr gruppieren.

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

Versuchen Sie folgendes:

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

Mit month() nur der Monat zurückgibt, aber die Funktion in der Abfrage über den ersten Tag des Monats wird wiederkommen, sondern als datetime Datentyp so, wenn Sie Gruppe von ihr, es das Jahr und den Monat inklusive.

rextester Demo: http://rextester.com/UJRN68337

kehrt:

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

würde ich row_number() verwenden:

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; 

Wenn Sie keine zusätzlichen Spalten benötigen, eine Aggregation wäre äquivalent:

select min(t.date) 
from t 
group by year(t.date), month(t.date); 
Verwandte Themen