Files
btcdata/resources/queries.sql
T

196 lines
7.7 KiB
SQL

-- queries for btcdata
-- :name insert-binance-price! :! :n
-- :doc Insert a Binance BTC price
INSERT INTO binance_price (price) VALUES (:price)
-- :name get-latest-binance-price :? :1
-- :doc Get the most recent Binance BTC price
SELECT price, recorded_at FROM binance_price ORDER BY id DESC LIMIT 1
-- :name upsert-kraken-hour! :! :n
-- :doc Upsert a Kraken hourly OHLC candle
INSERT INTO kraken_hour (ts, open, high, low, close, vwap, volume, trade_count)
VALUES (:ts, :open, :high, :low, :close, :vwap, :volume, :trade-count)
ON CONFLICT (ts) DO UPDATE
SET open = EXCLUDED.open,
high = EXCLUDED.high,
low = EXCLUDED.low,
close = EXCLUDED.close,
vwap = EXCLUDED.vwap,
volume = EXCLUDED.volume,
trade_count = EXCLUDED.trade_count
-- :name get-latest-kraken-hour :? :1
-- :doc Get the most recent Kraken hourly candle by timestamp
SELECT ts, open, high, low, close, vwap, volume, trade_count, created_at
FROM kraken_hour ORDER BY ts DESC LIMIT 1
-- :name upsert-kraken-day! :! :n
-- :doc Upsert a Kraken daily OHLC candle
INSERT INTO kraken_day (ts, open, high, low, close, vwap, volume, trade_count)
VALUES (:ts, :open, :high, :low, :close, :vwap, :volume, :trade-count)
ON CONFLICT (ts) DO UPDATE
SET open = EXCLUDED.open,
high = EXCLUDED.high,
low = EXCLUDED.low,
close = EXCLUDED.close,
vwap = EXCLUDED.vwap,
volume = EXCLUDED.volume,
trade_count = EXCLUDED.trade_count
-- :name get-latest-kraken-day :? :1
-- :doc Get the most recent Kraken daily candle by timestamp
SELECT ts FROM kraken_day ORDER BY ts DESC LIMIT 1
-- :name insert-strike-price! :! :n
-- :doc Insert a Strike ticker snapshot
INSERT INTO strike_price (rates, quote_sats) VALUES (:rates, :quote-sats)
-- :name get-latest-strike-price :? :1
-- :doc Get the most recent Strike ticker snapshot
SELECT rates, recorded_at FROM strike_price ORDER BY id DESC LIMIT 1
-- :name upsert-currency-rates! :! :n
-- :doc Upsert daily currency rates from Frankfurter
INSERT INTO currencies (rate_date, eur, dkk, eur_dkk, updated_at)
VALUES (:rate-date, :eur, :dkk, :eur-dkk, NOW())
ON CONFLICT (rate_date) DO UPDATE
SET eur = EXCLUDED.eur, dkk = EXCLUDED.dkk, eur_dkk = EXCLUDED.eur_dkk, updated_at = NOW()
-- :name get-latest-currency-rates :? :1
-- :doc Get the most recent currency rates
SELECT rate_date, eur, dkk, eur_dkk, updated_at FROM currencies ORDER BY rate_date DESC LIMIT 1
-- :name get-currency-rates-by-date :? :1
-- :doc Get currency rates for a specific date
SELECT rate_date, eur, dkk, eur_dkk, updated_at FROM currencies WHERE rate_date = :rate-date
-- Wallets -------------------------------------------------------------------
-- :name insert-wallet! :! :n
-- :doc Insert a new wallet
INSERT INTO wallets (name, wallet_type) VALUES (:name, :wallet-type)
-- :name get-all-wallets :? :*
-- :doc Get all wallets
SELECT id, name, wallet_type, created_at FROM wallets ORDER BY name
-- :name get-wallets-by-type :? :*
-- :doc Get wallets filtered by type
SELECT id, name, wallet_type, created_at FROM wallets WHERE wallet_type = :wallet-type ORDER BY name
-- :name get-wallet-by-id :? :1
-- :doc Get a wallet by ID
SELECT id, name, wallet_type, created_at FROM wallets WHERE id = :id
-- Events --------------------------------------------------------------------
-- :name insert-event! :? :1
-- :doc Insert a new event, returning its id
INSERT INTO events (event_type, occurred_at, sats, fee_sats, fiat_amount, fiat_currency, from_wallet_id, to_wallet_id, note)
VALUES (:event-type, :occurred-at, :sats, :fee-sats, :fiat-amount, :fiat-currency, :from-wallet-id, :to-wallet-id, :note)
RETURNING id
-- :name get-all-events :? :*
-- :doc Get all events with wallet names
SELECT e.id, e.event_type, e.occurred_at, e.recorded_at,
e.sats, e.fee_sats, e.fiat_amount, e.fiat_currency,
e.from_wallet_id, fw.name AS from_wallet_name,
e.to_wallet_id, tw.name AS to_wallet_name,
e.note
FROM events e
LEFT JOIN wallets fw ON fw.id = e.from_wallet_id
LEFT JOIN wallets tw ON tw.id = e.to_wallet_id
ORDER BY e.occurred_at DESC, e.id DESC
-- :name get-events-by-type :? :*
-- :doc Get events filtered by type
SELECT e.id, e.event_type, e.occurred_at, e.recorded_at,
e.sats, e.fee_sats, e.fiat_amount, e.fiat_currency,
e.from_wallet_id, fw.name AS from_wallet_name,
e.to_wallet_id, tw.name AS to_wallet_name,
e.note
FROM events e
LEFT JOIN wallets fw ON fw.id = e.from_wallet_id
LEFT JOIN wallets tw ON tw.id = e.to_wallet_id
WHERE e.event_type = :event-type
ORDER BY e.occurred_at DESC, e.id DESC
-- :name get-events-by-wallet :? :*
-- :doc Get events involving a specific wallet
SELECT e.id, e.event_type, e.occurred_at, e.recorded_at,
e.sats, e.fee_sats, e.fiat_amount, e.fiat_currency,
e.from_wallet_id, fw.name AS from_wallet_name,
e.to_wallet_id, tw.name AS to_wallet_name,
e.note
FROM events e
LEFT JOIN wallets fw ON fw.id = e.from_wallet_id
LEFT JOIN wallets tw ON tw.id = e.to_wallet_id
WHERE e.from_wallet_id = :wallet-id OR e.to_wallet_id = :wallet-id
ORDER BY e.occurred_at DESC, e.id DESC
-- :name truncate-deposits! :! :n
-- :doc Delete all rows from the deposits read table
TRUNCATE deposits
-- :name get-deposit-events :? :*
-- :doc Get bank_to_exchange events with exchange name, oldest first
SELECT e.id, e.occurred_at, e.fiat_amount, e.fiat_currency,
e.to_wallet_id, tw.name AS exchange, e.note
FROM events e
LEFT JOIN wallets tw ON tw.id = e.to_wallet_id
WHERE e.event_type = 'bank_to_exchange'
ORDER BY e.occurred_at ASC, e.id ASC
-- :name insert-deposit! :! :n
-- :doc Insert a projected deposit row
INSERT INTO deposits (event_id, occurred_at, exchange, fiat_amount, fiat_currency, amount_eur, amount_dkk, amount_usd, note)
VALUES (:event-id, :occurred-at, :exchange, :fiat-amount, :fiat-currency, :amount-eur, :amount-dkk, :amount-usd, :note)
-- :name get-all-deposits :? :*
-- :doc Get all projected deposits ordered by date descending
SELECT id, event_id, occurred_at, exchange, fiat_amount, fiat_currency,
amount_eur, amount_dkk, amount_usd, note
FROM deposits
ORDER BY occurred_at DESC, id DESC
-- :name get-kraken-hour-latest-24 :? :*
-- :doc Get the 24 most recent Kraken hourly candles
SELECT ts, open, high, low, close, vwap, volume, trade_count, created_at
FROM kraken_hour ORDER BY ts DESC LIMIT 24
-- :name get-kraken-minute-latest-60 :? :*
-- :doc Get the 60 most recent Kraken minute candles
SELECT ts, open, high, low, close, vwap, volume, trade_count, created_at
FROM kraken_minute ORDER BY ts DESC LIMIT 60
-- :name upsert-kraken-minute! :! :n
-- :doc Upsert a Kraken minute OHLC candle
INSERT INTO kraken_minute (ts, open, high, low, close, vwap, volume, trade_count)
VALUES (:ts, :open, :high, :low, :close, :vwap, :volume, :trade-count)
ON CONFLICT (ts) DO UPDATE
SET open = EXCLUDED.open,
high = EXCLUDED.high,
low = EXCLUDED.low,
close = EXCLUDED.close,
vwap = EXCLUDED.vwap,
volume = EXCLUDED.volume,
trade_count = EXCLUDED.trade_count
-- :name get-latest-kraken-minute :? :1
-- :doc Get the most recent Kraken minute candle timestamp
SELECT ts FROM kraken_minute ORDER BY ts DESC LIMIT 1
-- :name get-wallet-balances :? :*
-- :doc Compute sats balance per wallet from events
SELECT w.id, w.name,
COALESCE(SUM(CASE WHEN e.to_wallet_id = w.id THEN e.sats ELSE 0 END), 0)
- COALESCE(SUM(CASE WHEN e.from_wallet_id = w.id THEN e.sats ELSE 0 END), 0)
- COALESCE(SUM(CASE WHEN e.from_wallet_id = w.id THEN e.fee_sats ELSE 0 END), 0)
AS balance_sats
FROM wallets w
LEFT JOIN events e ON e.from_wallet_id = w.id OR e.to_wallet_id = w.id
GROUP BY w.id, w.name
ORDER BY w.name