尝试使用SQL将平面数据拉成类似数组的答案

时间:2015-12-26 23:24:04

标签: sql

我正在尝试使用SQL将平面数据拉成类似数组的答案,并需要一些帮助。

平面数据格式为:

timestamp, unique_id, value

...在桌子的每一行上一遍又一遍地称之为“temperature_values”。当你查看表时,它有很多行,其unique_id为“temp_low”,而很多行的unique_id为“temp_high”。对于每个时间戳,有一行带有“temp_low”unique_id,单行带有“temp_high”unique_id值。当然,时间戳字段在每一行上都是相同的。

因此,如果我只想查询“temp_low”或“temp_high”,那就很容易了。

但我想做的是有一个返回的SQL语句:

timestamp, temp_low, temp_high

...在每个结果行上使用时间戳作为唯一,这样就可以很容易地绘制每个时间戳的高温和慢速温度。我已经尝试了一些INNER JOIN到同一个表中,但我不确定这是解决这个问题的正确方法。

任何线索?

TIA - 戴夫

4 个答案:

答案 0 :(得分:1)

自我加入是一个很好的解决方案。如果temp low和temp high是唯一可能的唯一id,如果low真的总是小于或等于high,你也可以这样做:

SELECT timestamp, min(value) as temp_low, max(value) as temp_high
FROM table_name
GROUP BY timestamp

编辑:通过将表连接到自身,以下内容将起作用(假设每个时间戳只有一个高行和一个低行)

SELECT low.timestamp,
    low.value temp_low,
    high.value temp_high
FROM table_name low
JOIN table_name high
ON low.timestamp = high.timestamp
WHERE low.unique_id = 'temp_low'
    AND high.unique_id = 'temp_high'

或者假设每个时间戳最多只有一个高行和一个低行,但不一定都是:

SELECT coalesce(low.timestamp, high.timestamp) timestamp,
    low.value temp_low,
    high.value temp_high
FROM table_name low
FULL OUTER JOIN table_name high
ON low.timestamp = high.timestamp
WHERE (low.unique_id = 'temp_low' OR low.timestamp is null)
    AND (high.unique_id = 'temp_high' OR high.timestamp is null)

答案 1 :(得分:0)

这可以通过两个子查询(q1和q2)之间的连接来实现,并允许您忽略任何不高或低的ID:

SELECT q1.timestamp AS Time, High, Low FROM 
(SELECT timestamp, value AS High FROM temps
WHERE ID = 'temp_high') q1 INNER JOIN 
(SELECT timestamp, value AS Low From temps
WHERE ID = 'temp_low') q2 ON q1.Date = q2.Date;

答案 2 :(得分:0)

This可能是JOIN的一个很好的参考。假设将值分隔为单独的表并且时间戳匹配,则可以在时间戳上将它们连接起来。

SELECT temp_low_table.timestamp AS timestamp, temp_low_table.temp_low AS temp_low, temp_high_table.temp_high AS temp_high
FROM temp_low_table
INNER JOIN temp_high_table
ON temp_low_table.timestamp=temp_high_table.timestamp; 

答案 3 :(得分:0)

一个不涉及联接的非常简单的解决方案是使用group by +聚合函数(如minmax)和case语句:

select timestamp,
       max(case when unique_id = 'temp_low' then value end) as temp_low,
       max(case when unique_id = 'temp_high' then value end) as temp_high
  from temperature_values
 group by timestamp