どのようにしてこれらのテーブルに参加できますか?

私は、異なる時間に異なるデータを記録する多数のデバイスを有し、単一のクエリですべてのデータを時間順に取得したいと考えています。私が持っているテーブルの種類の例:

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

この種の問合せを作成する簡単な方法はありますか?

0

4 答え

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;
5
追加された
合体演算子を使用すると、ジョブが実行されます。 isnull()演算子は同じことを行いますが、2つのパラメータしか受け入れませんが、合体は多くのパラメータを受け入れます。
追加された 著者 AndrewBay,
魅力的な作品!どうもありがとう!
追加された 著者 brianestey,

次のようにdevice_id/timestampを取得するには 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
追加された

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

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 キーワードが必要であることに注意してください。

0
追加された