Encontrei alguns SQL pré-existentes que estou tendo dificuldade em entender.
SELECT
MAX(I.Symbol) Symbol
, MAX(I.Ticker) CUSIP
, MAX(I.Name) Name
, SUM(H.Quantity) TotalQuantity
, SUM(H.MarketValue) TotalMarketValue
, MAX(H.PriceLC) Price
, MAX(I.CategoryCode5) BUY_SELL
, MAX(I.EquivFactor1) PriceTgt
, MAX(P.LastPrice) CurrPrice
, MAX(I.AssetClass) Target
, MAX(I.Industry) Industry
, MAX(I.CategoryCode1) Risk
FROM
HOLDINGS_SECURE H
, INVESTMENTS I
, PRICE P
WHERE
H.Symbol = I.Symbol
AND I.Product = 'stock'
AND H.Quantity > 0
AND I.CategoryCode5 NOT IN ('X', '')
AND H.Symbol = P.Symbol
GROUP BY
I.Symbol
Symbol, Ticker, Name, CategoryCode5, Assest Class, Industry e CategoryCode1 são todos campos varchar. Os campos restantes são decimais.
Meu melhor palpite é que, de alguma forma, max está sendo usado para evitar várias colunas de agrupamento, mas como isso pode retornar os resultados corretos?
Você diz: "Meu melhor palpite é que, de alguma forma, o máximo está sendo usado para evitar várias colunas de agrupamento"
Está correto.
e então: "... mas como isso pode retornar os resultados corretos?"
Ele retorna resultados corretos porque
Symbol
é a chave primária nas tabelasInvestments
e nas .Price
Portanto, qualquer função agregada sobre aP.column
ou anI.column
está agregando valores idênticos. EMAX(c)
quandoc
é2, 2, 2 or 2
é claro2
.A consulta poderia ser escrita de outra forma, possivelmente sem todas essas agregações? Sim, veja uma pergunta relacionada: Por que os curingas nas instruções GROUP BY não funcionam?
Teria que ser uma
GROUP BY
cláusula bastante longa ou ter as agregações movidas para uma subconsulta apenas com aHoldings_Secure
tabela (ondeSymbol
não está a chave primária) e depois unidas às outras duas:Pode ser que as agregações se encaixem melhor em uma subconsulta e façam mais sentido quando é essa subconsulta que posteriormente é unida à outra tabela INVESTMENTS e PRICE - veja abaixo.
Nesse caso, você poderia dizer que a "razão" para isso poderia ser:
Pode ser que alguns dados nas tabelas não estejam normalizados corretamente, ou algo semelhante ao sugerido em outros comentários, ou pode estar simplesmente errado.
Aqui está um palpite de como talvez ele possa ser reescrito de forma mais organizada com uma subconsulta, seguida por outra consulta que pode ajudar a analisar os dados em busca de anomalias, se isso for necessário.
reescrita possível :
Você pode usar algo feio como isso para ver quais valores de I.Symbol - se houver algum - retornam mais de um valor distinto entre as colunas que são agregadas usando MAX e para ver precisamente quais são esses valores individuais.