在第一个null之前查找行

时间:2017-05-04 17:45:54

标签: sql postgresql

我有一张类似于此的表

timestamp              val
2017-05-04 06:00:00      2
2017-05-04 08:00:00      3
2017-05-04 09:35:00      5
2017-05-04 10:05:00      
2017-05-04 11:15:00      8
2017-05-04 12:10:00      
2017-05-04 13:35:00     12

并且我想在val字段中的第一个null之前找到记录(示例表中的时间戳为09:35的那个)。

有一种简单的方法吗?

由于

编辑:使用postgres 9.5 编辑2:对不起每个人我忘了提及有时候没有空值,在这种情况下我只需要最大时间戳。到目前为止提供的答案在这种情况下不起作用(对于原始问题中的松散解释再次感到遗憾)

3 个答案:

答案 0 :(得分:5)

lead()函数使用特定顺序返回分区的下一个值。

如果没有空值,此解决方案将返回最后一条记录。

with lg as
(
    select tm, val, 
           lead(val) over (order by tm) next_val
    from   your_table
)
select   tm as "timestamp", val
from     lg
where    next_val is null
order by tm
limit 1;
timestamp           | val
:------------------ | --:
2017-05-04 09:35:00 |   5

dbfiddle here

答案 1 :(得分:0)

嗯。嗯。 。

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("PathView path test")

    Path {
        id: path1
        startX: 100; startY: 100
        PathLine{ x: 300; y: 100 }
    }
    Path {
        id: path2
        startX: 100; startY: 100
        PathLine{ x: 100; y: 300 }
    }

    ListModel {
        id: pvModel
        ListElement{ name: "rectangle" }
        ListElement{ name: "rectangle" }
        ListElement{ name: "rectangle" }
    }

    Component {
        id: pvDelegate
        Rectangle {
            width: 50
            height: 50
            color: "red"
            border.width: 1
            Component.onCompleted: console.log("Rectangle created")
            Component.onDestruction: console.log("Rectangle deleted")
        }
    }

    property bool currentPath;
    PathView {
        anchors.fill: parent
        model: pvModel
        delegate: pvDelegate
        path: (currentPath ? path1 : path2)
    }

    Button {
        width: 100
        height: 40
        text: "Switch path"
        onClicked: currentPath = !currentPath
    }
}

答案 2 :(得分:0)

如果不是null值,它将返回第一个空值记录上方的最后一行。

select t.*
from t
where  t.timestamp <= (select min(t2.timestamp) 
                        from NAMEs t2 
                        where (t2.val is null or t2.timestamp = (select max(timestamp) from NAMES) ) 
                )
        and t2.val is not null        
order by t.timestamp desc
limit 1 ;