【问题标题】:SQLITE multiple row values into columnsSQLITE 多行值到列中
【发布时间】:2019-04-12 21:11:55
【问题描述】:

我有事件状态表,表结构已经定义好了,我想把几行值合并成一行。

当前表格数据:

事件:

EVENT       EVENTNAME       EVENTACTION     STATUS      TIMESTAMP
"Event1"    "FootBall"      "FootBall0"     "started"   "1554980085"
"Event1"    "TableTennis"   "TT0"           "started"   "1554980086"
"Event1"    "FootBall"      "FootBall0"     "success"   "1554980087"
"Event1"    "Chess"         "CHESS0"        "success"   "1554980095"
"Event1"    "TableTennis"   "TT0"           "running"   "1554980189"
"Event1"    "FootBall"      "FootBall1"     "started"   "1554980082"

我需要选择查询来显示数据如下:

EVENT       EVENTNAME       EVENTACTION     STATUS      STARTTIME   RUNNINGTIME ENDTIME
"Event1"    "FootBall"      "FootBall0"     "success"   1554980085  NULL        1554980087
"Event1"    "TableTennis"   "TT0"           "running"   1554980086  1554980189  NULL 
"Event1"    "Chess"         "CHESS0"        "success"   1554980098  NULL        1554980100

我必须显示EVENTEVENTNAMEEVENTACTION 和最新的STATUS 以及startedrunningsuccess 的时间戳,如果时间不存在则应设置@987654330 @。

我使用了带有大小写的 SELECT 查询,但时间戳没有放在单个相关行中。

SELECT AE.EVENT,
AE.EVENTNAME,
AE.EVENTACTION,
AE.STATUS,
(case WHEN AE.STATUS='started' THEN AE.timestamp END) as starttime,
(case WHEN AE.STATUS='running' THEN AE.timestamp END) as runningtime,
(case WHEN AE.STATUS in ('success','failed') THEN AE.timestamp END) as endtime
FROM agentEvents AE 
ORDER by timestamp ASC

任何线索。

【问题讨论】:

    标签: sqlite case


    【解决方案1】:

    需要按事件聚合,然后取MAXCASE表达式:

    SELECT
        AE.EVENT,
        AE.EVENTNAME,
        AE.EVENTACTION,
        MAX(CASE WHEN AE.STATUS = 'started' THEN AE.timestamp END) AS starttime,
        MAX(CASE WHEN AE.STATUS = 'running' THEN AE.timestamp END) AS runningtime,
        MAX(CASE WHEN AE.STATUS IN ('success', 'failed') THEN AE.timestamp END) AS endtime
    FROM agentEvents AE
    GROUP BY
        AE.EVENT,
        AE.EVENTNAME,
        AE.EVENTACTION
    ORDER BY
        MAX(CASE WHEN AE.STATUS = 'started' THEN AE.timestamp END);
    

    请注意,单独按timestamp 列排序是没有意义的,因为聚合后它不再存在。所以,我改为按开始时间订购。选择STATUS列也没有意义,所以我把它去掉了。

    【讨论】:

    • @1863229 EVENTNAME 以不同的时间戳重复它需要最新的记录,如果我也想显示历史记录,我们如何更改查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多