如何在postgresql中获取特定行的最接近日期

时间:2016-08-25 06:13:27

标签: mysql database postgresql select

我有以下问题:

我有一个包含两种类型数据的表。一个状态= 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,因此设置了最后一行(前一行)的日期

我希望我的意图现在可以理解。

3 个答案:

答案 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)