2

我有一个像这样的数据;

        [
        {"deviceid":"d1","parameter"="p1" value="1" timestamp="2018-03-22T12:33:00"},
        {"deviceid":"d1","parameter"="p2" value="2" timestamp="2018-03-22T12:34:00"},
        {"deviceid":"d1","parameter"="p2" value="3" timestamp="2018-03-22T12:35:00"},
        {"deviceid":"d2","parameter"="p1" value="4" timestamp="2018-03-22T12:36:00"},
        {"deviceid":"d2","parameter"="p2" value="5" timestamp="2018-03-22T12:37:00"},
        {"deviceid":"d2","parameter"="p2" value="6" timestamp="2018-03-22T12:38:00"},
        {"deviceid":"d2","parameter"="p1" value="7" timestamp="2018-03-22T12:43:00"},
        {"deviceid":"d2","parameter"="p1" value="8" timestamp="2018-03-22T12:44:00"},
        {"deviceid":"d2","parameter"="p2" value="9" timestamp="2018-03-22T12:45:00"},
        {"deviceid":"d1","parameter"="p1" value="10" timestamp="2018-03-22T12:46:00"},
        {"deviceid":"d1","parameter"="p1" value="11" timestamp="2018-03-22T12:47:00"},
        {"deviceid":"d1","parameter"="p2" value="12" timestamp="2018-03-22T12:49:00"}
        ]

我想旋转该参数值(每10分钟窗口)并显示每个设备ID的每个参数的最后接收值,就像这个 编辑*(参数将是动态的,而不仅仅是p1和p2)

------------------------------------------------------------
| deviceid|     windowtime       |     p1    |     p2      |
------------------------------------------------------------
| d1      | 2018-03-22 12:40     |     1     |      3      |
------------------------------------------------------------
| d2      | 2018-03-22 12:40     |     4     |      6      | 
------------------------------------------------------------
| d2      | 2018-03-22 12:50     |     8     |      9      |
------------------------------------------------------------
| d1      | 2018-03-22 12:50     |     11    |     12      |
------------------------------------------------------------

谢谢你。

4

2 回答 2

0

你可以试试下面的脚本:

with tempone as (SELECT
    deviceid, system.Timestamp as windowtime, max(value) AS P1      
FROM
    test TIMESTAMP BY timestamp
where parameter = 'p1'
GROUP BY
    deviceid,
    TumblingWindow(minute, 10)),

temptwo AS ( SELECT
    deviceid, system.Timestamp as windowtime, max(value) AS P2      
FROM
    test TIMESTAMP BY timestamp
where parameter = 'p2'
GROUP BY
    deviceid,
    TumblingWindow(minute, 10))

select tempone.deviceid, tempone.windowtime, tempone.P1, temptwo.P2 from tempone
join temptwo on tempone.deviceid = temptwo.deviceid
and DATEDIFF(minute,tempone, temptwo) BETWEEN 0 AND 1
于 2018-03-22T18:22:19.287 回答
0

另一种更清晰的方法是使用 UDA :

SELECT
    deviceid, system.Timestamp as windowtime, uda.P1UDA(test) AS P1, uda.P2UDA(test) AS P2   
FROM
    test TIMESTAMP BY timestamp
GROUP BY
    deviceid,
    TumblingWindow(minute, 10)

JavaScript UDA:

function P1UDA() {
    this.init = function () 
{
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {

        if (value.parameter == 'p1') {
            if (value.value > this.state) {
                this.state = value.value;
            }
        }
    }

    this.computeResult = function () {
        return this.state;
    }
}

function P2UDA() {
    this.init = function () {
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {

        if (value.parameter == 'p2') {
            if (value.value > this.state) {
                this.state = value.value;
            }
        }
    }

    this.computeResult = function () {
        return this.state;
    }
}
于 2018-03-22T19:53:25.840 回答