2011-12-19 4 views
0

異なる時間に異なるデータを記録する多数のデバイスがあり、すべてのデータを1つのクエリで時間順に取得する必要があります。私が持っているテーブルの種類の例:これらのテーブルをどのように結合できますか?

CREATE TABLE location(
    device_id INT, -- REFERENCES device(id) 
    timestamp DATETIME2 NOT NULL, 
    position GEOMETRY NOT NULL 
) 

CREATE TABLE temperature(
    device_id INT, -- REFERENCES device(id) 
    timestamp DATETIME2 NOT NULL, 
    temp FLOAT NOT NULL 
) 

私はタイムスタンプが一致しない場合にNULLを含んでDEVICE_IDとタイムスタンプにテーブルを結合する単一のクエリを持っていると思います。私が求めている出力形式の例は次のとおりです。

device_id, timestamp, location, temperature 
1, 2011/12/1 10:00:00, (35.1, 139.2), NULL 
1, 2011/12/1 10:00:01, NULL, 9.0 
1, 2011/12/1 10:00:02, (35.1, 139.2), 9.1 

私はFULLをやってみたのJOINが、巨大なCASE文なしにタイムスタンプ列を行う方法を見つけ出すことはできません、私が唯一示されましたが、(心に留めておきます2つのテーブル、これはもっと多く持つことができます)。

SELECT 
    location.device_id, 
    CASE WHEN location.timestamp IS NOT NULL THEN 
     location.timestamp 
    ELSE 
     temperature.timestamp 
    END as timestamp, 
    location, 
    temp 
FROM 
    location 
    FULL JOIN temperature ON location.device_id = temperature.device_id 
     AND location.timestamp = temperature.timestamp 
ORDER BY 
    timestamp 

このような種類のクエリを作成する簡単な方法はありますか?

答えて

5

COALESCEという表現を使用できます。

SELECT 
    location.device_id, 
    COALESCE(location.timestamp, temperature.timestamp) as timestamp, 
    position, 
    temp 
FROM 
    location 
    FULL JOIN temperature ON location.device_id = temperature.device_id 
     AND location.timestamp = temperature.timestamp 
ORDER BY 
    timestamp; 
+0

coalesce演算子を使用すると、ジョブが実行されます。 isnull()演算子は同じことを行いますが、2つのパラメータしか受け入れませんが、合体は多くを受け入れます。 – AndrewBay

+0

魅力的な作品です!どうもありがとう! – brianestey

0

はい、温度テーブルにOUTER結合を使用できます。これは、温度表に一致する行がない場合にはnullを返します。

0

次のように、DEVICE_ID /タイムスタンプを取得するCOALESCEが必要:

SELECT 
    COALESCE(l.device_id, t.device_id) as device_id, 
    COALESCE(l.timestamp, t.timestamp) as timestamp, 
    l.position as location, 
    t.temp as temperature 
FROM location l 
FULL JOIN temperature t ON l.device_id = t.device_id 
    AND l.timestamp = t.timestamp 
ORDER BY 2 

はまた、非常に短い名前(LおよびT)でテーブルをエイリアシングにより増加し、読みやすさの点に注意してください。

あなたはあなたの順序を確認することをお勧めします - おそらくあなたはORDER BY 1, 2代わり

0
SELECT device_id, timestamp, position, NULL AS temp 
    FROM location 
UNION ALL 
SELECT device_id, timestamp, NULL AS position, temp 
    FROM temperature 
ORDER 
    BY timestamp; 

をしたいがALLキーワードがここで必要とされます。

関連する問題