2016-09-16 73 views
0

有一個表post_status_changes,這是後狀態更改記錄獲取後狀態從狀態變更記錄每一天

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 

我想要得到的是從大亞灣每一天忙到的發佈狀態DayB列表爲期結束。

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 

任何解決方案?

回答

0

溶液這裏找到: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

一些SQL解?關於sql, – Grosefaid

+0

我不能說。如果你有唯一的方法來使用sql,那麼在我腦海中只有手動創建包含查詢中所有日期的sql的方法,並且可以使用JavaScript書籤自動完成,以填充SQL輸入字段正確的SQL命令。但你需要在這種情況下做更多的研究,以獲得如下代碼:'javascript:function(){..... final = date1 + date2 ...};'如果你不明白我說的話,那麼你可以不理會我的評論。 –

0

對於每個POST_ID你想盡可能多的行,也有開始和結束日期之間的天數。這可以通過交叉與post_ids加入日期列表來完成,那麼結果加入回到談判桌來獲得每一天的狀態:

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; 

運行例如:http://rextester.com/CSX38222

+0

在結果: 「3 \t 2016年9月3日00:00:00 \t 5」 這是錯誤的 – 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

這是無效的Postgres(沒有'轉換()'函數,方括號中的標識符無效)。您至少應該使用標準SQL來處理標記爲'sql' –

+0

的問題並且它如何生成2016-09-01或2016-09-05中不存在的行? –

+0

因爲我是回答堆棧溢出問題的新手,我忽略了這是根據postgresql標記分類的。我正在使用T-SQL,也忽略了生成元素不在表中的系列。我在這裏發現了有關在T-SQL中生成一個系列的信息,以防萬一有人感興趣,即使我應該根據它們分類下的標籤回答問題:http://sqlperformance.com/2013/01/t- SQL查詢/生成-A-設置1 – 2016-09-17 01:52:39