简体   繁体   中英

Getting a column without grouping by it - Postgres

I am using the following query to get data from my table:

SELECT base_asset_trade, base_asset_icon,
       count(CASE WHEN is_buyer_maker = 'true' THEN 1 END) AS sold,
       count(CASE WHEN is_buyer_maker = 'false' THEN 1 END) AS bought,
       sum(CASE WHEN is_buyer_maker = 'true' THEN trade_value  END) AS sold_trade_value,
       sum(CASE WHEN is_buyer_maker = 'false'  THEN trade_value  END) AS bought_trade_value,
       COUNT(base_asset_trade) AS total_trades
FROM trades
WHERE trade_time / 1000 > (extract(epoch from now()) - (86400)*1) 
GROUP BY base_asset_trade, base_asset_icon
ORDER BY total_trades DESC

This is the schema of the table.

id (int)
exchange_name (VARCHAR)
exchange_icon (VARCHAR)
trade_time (bigint)
price_quote (int)
price_usd (int)
trade_value (int)
base_asset_icon (VARCHAR)
qty (int)
quoteQty (int)
is_buyer_maker (boolean)
pair (VARCHAR)
base_asset_trade (VARCHAR)
quote_asset_trade (VARCHAR)

Now I need the data grouped only by base_asset_trade but I need the base_asset_icon as well. How do I get the icon without grouping by it?

IF for each base_asset_icon there is always one and only one base_asset_trade , then you can use any aggregate function ( MAX , MIN ) to fetch it out in SELECT statement, ie:

SELECT base_asset_trade, MAX(base_asset_icon),
       count(CASE WHEN is_buyer_maker = 'true' THEN 1 END) AS sold,
       count(CASE WHEN is_buyer_maker = 'false' THEN 1 END) AS bought,
       sum(CASE WHEN is_buyer_maker = 'true' THEN trade_value  END) AS sold_trade_value,
       sum(CASE WHEN is_buyer_maker = 'false'  THEN trade_value  END) AS bought_trade_value,
       COUNT(base_asset_trade) AS total_trades
FROM trades
WHERE trade_time / 1000 > (extract(epoch from now()) - (86400)*1) 
GROUP BY base_asset_trade
ORDER BY total_trades DESC

Otherwise , you can use an aggregate function that does not lose values, such as array_agg :

SELECT base_asset_trade, ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(base_asset_icon), ','),
       count(CASE WHEN is_buyer_maker = 'true' THEN 1 END) AS sold,
       count(CASE WHEN is_buyer_maker = 'false' THEN 1 END) AS bought,
       sum(CASE WHEN is_buyer_maker = 'true' THEN trade_value  END) AS sold_trade_value,
       sum(CASE WHEN is_buyer_maker = 'false'  THEN trade_value  END) AS bought_trade_value,
       COUNT(base_asset_trade) AS total_trades
FROM trades
WHERE trade_time / 1000 > (extract(epoch from now()) - (86400)*1) 
GROUP BY base_asset_trade
ORDER BY total_trades DESC

and if you want to keep the values as a string, you can use ARRAY_TO_STRING function too:

SELECT base_asset_trade, ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(base_asset_icon), ','),
       count(CASE WHEN is_buyer_maker = 'true' THEN 1 END) AS sold,
       count(CASE WHEN is_buyer_maker = 'false' THEN 1 END) AS bought,
       sum(CASE WHEN is_buyer_maker = 'true' THEN trade_value  END) AS sold_trade_value,
       sum(CASE WHEN is_buyer_maker = 'false'  THEN trade_value  END) AS bought_trade_value,
       COUNT(base_asset_trade) AS total_trades
FROM trades
WHERE trade_time / 1000 > (extract(epoch from now()) - (86400)*1) 
GROUP BY base_asset_trade
ORDER BY total_trades DESC

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM