我有以下问题:
我有一个包含两种类型数据的表。一个状态= 1,一个状态= 2.对于状态= 2的每一行,我需要最后一个状态为1的日期。这是一个例子:
date state id
'2016-04-03' 1 1
'2016-04-04' 1 1
'2016-04-05' 2 1
'2016-04-06' 2 1
预期结果:
date lastdate state id
'2016-04-03' '2016-04-03' 1 1
'2016-04-04' '2016-04-04' 1 1
'2016-04-05' '2016-04-04' 2 1
'2016-04-06' '2016-04-04' 2 1
'2016-04-07' '2016-04-07' 1 1
我不知道我被困在哪里。感觉就像这个问题你正在以错误的方式看待,所以任何帮助都会受到赞赏。
提前谢谢!修改
由于我似乎没有充分解释我的问题,这是另一次尝试:
对于每一行,我需要具有相同id且具有state = 1的最后一行的日期。如果状态已经是1,则需要同一行的日期。
所以澄清我的“预期结果” - 表:
date lastdate state id
'2016-04-03' '2016-04-03' 1 1
状态为1,因此行的日期是状态1的最后日期
'2016-04-04' '2016-04-04' 1 1
状态为1,因此行的日期是状态1的最后日期
'2016-04-05' '2016-04-04' 2 1
状态为2,因此日期1的最后一行的日期来自
之前的行'2016-04-06' '2016-04-04' 2 1
州是2,州= 1的最后日期是'2016-04-04'
'2016-04-07' '2016-04-07' 1 1
状态再次为1,所以同一日期
'2016-04-08' '2016-04-07' 2 1
状态为2,因此设置了最后一行(前一行)的日期
我希望我的意图现在可以理解。
答案 0 :(得分:0)
我会建议这样的事情(我不确定语法中的所有内容是否正确):
Alamofire.request(.GET, urlRequest).responseJSON(completionHandler: { response in
guard let dictionary = response.result.value as? [String : AnyObject]
else {
completion(response: false)
return
}
if dictionary["status"] != nil {
completion(response: false)
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
print("\(NSDate()) start parse feeds with offset")
self.parseArticle(dictionary, data: [])
print("\(NSDate()) finish parse feeds with offset")
UserSession.feedsLoaded = true
//here I have 40 objects
dispatch_async(dispatch_get_main_queue(), {
//here I have again 20 objects, which I had at start
completion(response: true)
})
})
})
func parseArticle(dictionary : [String : AnyObject], data : [String]) {
var startData = data
var endData : [String] = []
let realm = try! Realm()
let _ = try? realm.write() {here is the code of my parser}}
这可以通过CREATE OR REPLACE FUNCTION dates() RETURNS TABLE (date DATE, lastdate DATE,
state INTEGER, id INTEGER) AS $$
DECLARE
lastType1 DATE;
BEGIN
FOR d IN (SELECT * FROM tableName)
LOOP
IF d.state == 1 THEN
lastType1 = d.date;
END IF;
RETURN NEXT (d.date, lastType1, d.state, d.id);
END LOOP;
RETURN;
END
LANGUAGE 'plpgsql';
来调用,如果你想像桌子那样访问它我建议创建一个调用函数的视图
你只需要代替SELECT * FROM dates()
你想要调用你的函数,而不是dates()
你实际调用的是什么
答案 1 :(得分:0)
这是我的解决方案
WHEN NOT MATCHED
答案 2 :(得分:0)
这可以通过将表连接到自身来实现:
select distinct on (a.date)
a.date date,
coalesce(b.date, a.date) last_date,
a.state,
a.id
from test a
left join test b
on a.state = 2 and b.state = 1 and b.date < a.date
order by a.date, b.date desc;
date | last_date | state | id
------------+------------+-------+----
2016-04-03 | 2016-04-03 | 1 | 1
2016-04-04 | 2016-04-04 | 1 | 1
2016-04-05 | 2016-04-04 | 2 | 1
2016-04-06 | 2016-04-04 | 2 | 1
2016-04-07 | 2016-04-07 | 1 | 1
(5 rows)