SQL

データベースの構造を確認

為替データ(forex_prices)の最新価格を取得

SELECT
    currency_pair,
    date,
    open / 100.0 AS open,
    high / 100.0 AS high,
    low / 100.0 AS low,
    close / 100.0 AS close,
    adjusted_close / 100.0 AS adjusted_close,
    volume
FROM
    forex_prices
WHERE
    date = (SELECT MAX(date) FROM forex_prices)
ORDER BY
    currency_pair;

株式指数データ(indices_prices)の最新価格を取得

SELECT
    index_name,
    date,
    open / 100.0 AS open,
    high / 100.0 AS high,
    low / 100.0 AS low,
    close / 100.0 AS close,
    adjusted_close / 100.0 AS adjusted_close,
    volume
FROM
    indices_prices
WHERE
    date = (SELECT MAX(date) FROM indices_prices)
ORDER BY
    index_name;

商品データ(commodities_prices)の最新価格を取得

SELECT
    commodity_name,
    date,
    open / 100.0 AS open,
    high / 100.0 AS high,
    low / 100.0 AS low,
    close / 100.0 AS close,
    adjusted_close / 100.0 AS adjusted_close,
    volume
FROM
    commodities_prices
WHERE
    date = (SELECT MAX(date) FROM commodities_prices)
ORDER BY
    commodity_name;

債券・金利データ(bonds_rates)の最新値を取得

SELECT
    bond_name,
    date,
    value / 100.0 AS value
FROM
    bonds_rates
WHERE
    date = (SELECT MAX(date) FROM bonds_rates)
ORDER BY
    bond_name;

ボラティリティ指数データ(volatility_indices)の最新値を取得

SELECT
    index_name,
    date,
    value / 100.0 AS value
FROM
    volatility_indices
WHERE
    date = (SELECT MAX(date) FROM volatility_indices)
ORDER BY
    index_name;

仮想通貨データ(crypto_prices)の最新価格を取得

SELECT
    crypto_name,
    date,
    open / 100.0 AS open,
    high / 100.0 AS high,
    low / 100.0 AS low,
    close / 100.0 AS close,
    adjusted_close / 100.0 AS adjusted_close,
    volume
FROM
    crypto_prices
WHERE
    date = (SELECT MAX(date) FROM crypto_prices)
ORDER BY
    crypto_name;

クエリの説明

  • SELECT
    • 資産名(currency_pair, index_name, commodity_name, bond_name, crypto_name)と最新の価格データを取得します。
    • 価格データは、保存時に100倍されて整数として保存されているため、/ 100.0 で割り、小数点以下二桁の値に戻しています。
  • WHERE
    • date = (SELECT MAX(date) FROM テーブル名) を使用して、各テーブルの最新の日付のデータのみを取得しています。
  • ORDER BY
    • 資産名でソートして、結果を見やすくしています。

全銘柄の最新価格を一度に取得する方法

全てのテーブルの最新データを一つのクエリで取得することはSQLiteでは直接できませんが、各テーブルから取得したデータをUNION ALLで結合することで、一つの結果セットとして表示することが可能です。

以下は、為替データ、株式指数データ、商品データ、仮想通貨データをまとめて取得する例です。

SELECT
    'Forex' AS asset_type,
    currency_pair AS asset_name,
    date,
    open / 100.0 AS open,
    high / 100.0 AS high,
    low / 100.0 AS low,
    close / 100.0 AS close,
    adjusted_close / 100.0 AS adjusted_close,
    volume
FROM
    forex_prices
WHERE
    date = (SELECT MAX(date) FROM forex_prices)

UNION ALL

SELECT
    'Index' AS asset_type,
    index_name AS asset_name,
    date,
    open / 100.0,
    high / 100.0,
    low / 100.0,
    close / 100.0,
    adjusted_close / 100.0,
    volume
FROM
    indices_prices
WHERE
    date = (SELECT MAX(date) FROM indices_prices)

UNION ALL

SELECT
    'Commodity' AS asset_type,
    commodity_name AS asset_name,
    date,
    open / 100.0,
    high / 100.0,
    low / 100.0,
    close / 100.0,
    adjusted_close / 100.0,
    volume
FROM
    commodities_prices
WHERE
    date = (SELECT MAX(date) FROM commodities_prices)

UNION ALL

SELECT
    'Crypto' AS asset_type,
    crypto_name AS asset_name,
    date,
    open / 100.0,
    high / 100.0,
    low / 100.0,
    close / 100.0,
    adjusted_close / 100.0,
    volume
FROM
    crypto_prices
WHERE
    date = (SELECT MAX(date) FROM crypto_prices)

ORDER BY
    asset_type,
    asset_name;

クエリの説明

  • UNION ALL を使用して、各テーブルから取得したデータを結合しています。
  • asset_type カラムを追加して、資産の種類を識別しています。
  • カラム名の統一:各テーブルで資産名のカラム名が異なるため、エイリアスを使用して統一しています(asset_name)。
  • 価格の変換:保存時に100倍された価格を元に戻しています。

債券・金利データとボラティリティ指数データの追加

上記のクエリに、債券・金利データとボラティリティ指数データを含めることも可能です。

-- 前のクエリに続けて

UNION ALL

SELECT
    'Bond/Rate' AS asset_type,
    bond_name AS asset_name,
    date,
    NULL AS open,
    NULL AS high,
    NULL AS low,
    value / 100.0 AS close,
    NULL AS adjusted_close,
    NULL AS volume
FROM
    bonds_rates
WHERE
    date = (SELECT MAX(date) FROM bonds_rates)

UNION ALL

SELECT
    'Volatility Index' AS asset_type,
    index_name AS asset_name,
    date,
    NULL AS open,
    NULL AS high,
    NULL AS low,
    value / 100.0 AS close,
    NULL AS adjusted_close,
    NULL AS volume
FROM
    volatility_indices
WHERE
    date = (SELECT MAX(date) FROM volatility_indices)

ORDER BY
    asset_type,
    asset_name;