我正在尝试使用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 - 戴夫
答案 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
+聚合函数(如min
或max
)和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