2017-08-26 1 views
1

Ainsi, les en-têtes de table de base de données sont les suivantes:Trouvez la min + valeur max et colonne associée

Date | buyPrice | sellPrice | buyVolume | sellVolume | exchange

Je suis en train de:

  1. Liste item
  2. Groupe par date
  3. Pour chaque groupe, trouvez le prix minimum d'achat et l'échange qui lui est associé
  4. Fin d la sellPrice maximale et l'échange associé
  5. Trouver la diff entre max (sellPrice) - min (buyPrice)

D'après ce que je lis, je peux utiliser des lignes ou était-il une meilleure solution?

(postgresql aide)

Edit: Si nous supposons que nous avons 3 échanges avec les données suivantes:

|Date | buyPrice | sellPrice | buyVolume | sellVolume | exchange | |1-1-2017 | 1 | 1 | 1 | 1 | exchangeA | |1-1-2017 | 2 | 1 | 2 | 1 | exchangeB | |1-1-2017 | 3 | 1 | 3 | 1 | exchangeC |

La sortie de solution doit être

| Date | buyPrice | buyVolume | buyExchange | sellPrice | sellVolume | sellExchange | | 1-1-2017 | 1 | 1 | exchangeA | 3 | 1 | exchangeC

+0

Dans votre exemple de sortie, comment vous obtenez '' sellPrice' de 3' si vous avez seulement '1' comme' sellPrice' dans votre exemple de données? – MiguelKVidal

Répondre

0

Ok donc je réussi à l'obtenir grâce à d'autres questions ..

SELECT t1.createdAt, t1.sellPrice, t1.exchangeId AS sellExchange, t2.buyPrice, t2.exchangeId AS buyExchange, t1.sellPrice - t2.buyPrice AS spread, 
     CASE 
     WHEN t1.sellVolume < t2.buyVolume THEN t1.sellVolume 
     ELSE t2.buyVolume 
     END AS minVolume 
FROM 
    (SELECT a.createdAt, a.sellPrice, a.sellVolume, a.exchangeid, a.quoteId 
    FROM quotes a 
    INNER JOIN (
     SELECT createdAt, max(sellPrice) AS sellPrice 
     FROM quotes 
     GROUP BY createdAt 
    ) b ON a.createdAt = b.createdAt AND a.sellPrice = b.sellPrice) 
    t1 INNER JOIN 
    (SELECT a.createdAt, a.buyPrice, a.buyvolume, a.exchangeid, a.quoteId 
    FROM quotes a 
    INNER JOIN (
     SELECT createdAt, min(buyPrice) AS buyPrice 
     FROM quotes 
     GROUP BY createdAt 
    ) b ON a.createdAt = b.createdAt AND a.buyPrice = b.buyPrice) 
    t2 ON t1.createdAt = t2.createdAt 

sera de retour createdAt | sellPrice | sellExchange | buyPrice | buyExchange | volume| spread

0

J'ai essayé une approche différente en utilisant CTE:

WITH MinMaxPrice AS (
    SELECT 
     createdAt, MIN(buyPrice) AS MinBuyPrice, MAX(sellPrice) AS MaxSellPrice 
    FROM quotes 
    GROUP BY createdAt 
) 
SELECT 
    MinMaxPrice.createdAt, 
    MinMaxPrice.MinBuyPrice, 
    qBuy.buyVolume, 
    qBuy.exchange AS buyExchange, 
    MinMaxPrice.MaxSellPrice, 
    qSell.sellVolume, 
    qSell.exchange AS sellExchange, 
    MinMaxPrice.MinBuyPrice - MinMaxPrice.MaxSellPrice AS spread 
FROM MinMaxPrice 
INNER JOIN quotes qBuy ON MinMaxPrice.createdAt = q.createdAt AND MinMaxPrice.MinBuyPrice = q.buyPrice 
INNER JOIN quotes qSell ON MinMaxPrice.createdAt = q.createdAt AND MinMaxPrice.MaxSellPrice = q.sellPrice 
; 

Je n'ai pas PostgreSQL ici, donc je n'ai pas pu le tester, mais je crois que cela fonctionne.

Si vous rencontrez un problème, faites le moi savoir et je vais le réparer.

+0

Les informations ci-dessus est juste dans un seul tableau. Cependant le BuyPrice et le SellPrice seront toujours un échange différent (c'est-à-dire pour une date donnée, exchange1 a le prix d'achat minimum et l'échange 2 a le prix de vente maximum) –

+0

Juste ajouté un peu plus d'information ci-dessus –