2016-09-16 3 views
0

Es gibt einen Tisch post_status_changes, die Geschichte der Post-Status ist ändertErhalten Sie Post-Status für jeden Tag von Statusänderung Geschichte

post_id |   created_at | status 
---------+---------------------+--------- 
     3 | 2016-09-02 04:00:00 | 1  
     3 | 2016-09-04 19:59:21 | 2  
     6 | 2016-09-03 15:00:00 | 5  
     6 | 2016-09-03 19:52:46 | 1  
     6 | 2016-09-04 20:53:22 | 2 

Was bekomme ich will für jeden Tag von Daya bis DayB der Post-Status ist eine Liste für das Ende des Datums.

DayA = 2016-09-01 
DayB = 2016-09-05 
post_id | date  | status 
-----------+-------------+--------- 
     3 | 2016-09-01 | null   
     3 | 2016-09-02 | 1   
     3 | 2016-09-03 | 1 
     3 | 2016-09-04 | 2 
     3 | 2016-09-05 | 2 
     6 | 2016-09-01 | null 
     6 | 2016-09-02 | null 
     6 | 2016-09-03 | 1 
     6 | 2016-09-04 | 2 
     6 | 2016-09-05 | 2 

Irgendwelche Lösungen?

Antwort

0

Lösung wurde hier gefunden: PHP: Return all dates between two dates in an array

$period = new DatePeriod(
    new DateTime('2010-10-01'), 
    new DateInterval('P1D'), 
    new DateTime('2010-10-05') 
); 

foreach ($period as $each){ 
    //.. QUERY here, where "CREAtED_AT" = $each 
} 
+0

einiger sql Lösung? – Grosefaid

+0

über SQL, kann ich nicht sagen. Wenn Sie die einzige Möglichkeit haben, dies mit sql zu tun, kommt in meinen Augen nur der manuelle Weg zum Erstellen der SQL, die alle Daten in der Abfrage enthält, und das kann automatisch mit JavaScript-Lesezeichen, um das SQL-Eingabefeld mit gefüllt werden der richtige SQL-Befehl aber du musst in diesem Fall noch mehr recherchieren, um Code zu bekommen wie: 'javascript: function() {..... final = date1 + date2 ...};' wenn du nicht verstehst, was ich sage, dann du kann diesen Kommentar überhaupt nicht beachten. –

0

Für jede post_id Sie so viele Zeilen wollen, wie es Tage zwischen dem Start- und Enddatum sind. Dies kann durch Quer Verbinden der Liste der Termine mit der post_ids erfolgen und dann dieses Ergebnis kommt zurück an den Tisch für jeden Tag, den Status zu erhalten:

select x.post_id, t.created, p.status 
from generate_series(date '2016-09-01', date '2016-09-05', interval '1' day) as t(created) 
    cross join (
    select distinct post_id 
    from post_status_changes 
) x 
    left join post_status_changes p on p.created_at::date = t.created 
order by 1,2; 

Lauf Beispiel: http://rextester.com/CSX38222

+0

In Ergebnissen: „3 \t 2016.09.03 00.00.00 \t 5“ Das ist falsch – Grosefaid

0
with a as 
    (select convert(varchar(10), created_at, 102) [date], [status], 
    post_id, rank() over (partition by convert(varchar(10), created_at), 
    post_id order by created_at desc) as r 
    from post_status_changes) 
select post_id, [date], [status] from a where r = 
    (select top 1 r from a as a2 where a.[date] = 
    a2.[date] and a.[post_id] = a2.[post_id]) 
    and @DayA <= [date] and @DayB >= [date] order by post_id, [date]; 
+0

Das für Postgres ungültig ist (es gibt keine 'convert()' Funktion und eckige Klammern sind in einer Kennung ungültig). Sie sollten mindestens Standard-SQL für eine Frage verwenden, die mit 'sql' markiert ist. –

+0

Und wie generiert es die Zeilen für 2016-09-01 oder 2016-09-05, die in der Tabelle nicht vorhanden sind? –

+0

Da ich Fragen zu Stack-Überlauf neu beantworte, habe ich übersehen, dass dies unter dem Postgresql-Tag kategorisiert wurde. Ich benutzte T-SQL und vernachlässigte auch, die Reihe zu erzeugen, in der die Elemente nicht in der Tabelle sind. Ich habe hier Informationen über das Generieren einer Serie in T-SQL gefunden, falls jemand interessiert ist, obwohl ich Fragen entsprechend dem Tag beantworten sollte, unter dem sie kategorisiert sind: http://sqlperformance.com/2013/01/t- sql-Abfragen/generate-a-set-1 –

Verwandte Themen