Meu objetivo final é comparar duas linhas (existirão apenas duas) e para um tipo específico e determinar se os valores de suas linhas são maiores que os outros valores de tipo de linha. O resultado que obtive parece ser difícil de manejar, o que me faz pensar se isso pode ser feito de maneira mais rápida ou mais elegante.
Eu criei o sql fiddle aqui que demonstra o problema.
Digamos que estamos transportando carga e nossa rota principal do tipo 1 precisa ser comparada com a outra rota do tipo 2. Cada rota tem um valor Wave e um valor Roll que precisam ser comparados independentemente. Observe que outros tipos de rota (exceto a principal, é sempre usado) podem ser comparados ao Main
valor do tipo 1, mas apenas dois de cada vez .
CREATE TABLE Shipping
(
[RouteID] [INT] NOT NULL,
[WaveValue] [INT] NOT NULL,
[RollValue] [INT] NOT NULL
);
INSERT Shipping(RouteID, WaveValue, RollValue)
VALUES (1, 20, 2), -- This is the main route
(2, 10, 30); -- The other secondary route, (only 2 items ever in this table)
Com os valores atualmente na tabela esperamos que a MainsWave seja maior que a outra onda e o inverso para o Roll.
Aqui está o sql de trabalho, observe que o verdadeiro resultado final está preocupado apenas com IsMainWaveGreater
e, IsMainRollGreater
mas todas as colunas são mostradas para depuração :
SELECT Max1.RouteID
, Max1.WaveValue
, Max1.RollValue
, MaxOther.RouteID
, MaxOther.WaveValue
, MaxOther.RollValue
, IIF(Max1.RouteID = 1,
IIF(Max1.WaveValue > MaxOther.WaveValue, 1, 0),
IIF(Max1.WaveValue > MaxOther.WaveValue, 0, 1)) AS IsMainWaveGreater
, IIF(Max1.RouteID = 1,
IIF(Max1.RollValue > MaxOther.RollValue, 1, 0),
IIF(Max1.RollValue > MaxOther.RollValue, 0, 1)) AS IsMainRollGreater
FROM
Shipping AS Max1
INNER JOIN Shipping AS MaxOther ON Max1.RouteID > MaxOther.RouteID;
Como a linha que pode ser lida primeiro e unida à próxima pode não ser a rota principal ( lembre-se sempre do valor 1 em RouteID
main ), o sql deve ter um IIF
que verifique qual é o tipo Max1 e, em seguida, troque a verificação/resultados de acordo .
Isso pode ser otimizado ou mesmo reescrito?
Esta é apenas uma operação em um processo CTE para que outras operações possam ser realizadas.
Com duas linhas por tabela, qualquer método será bom.
Como você está bem em codificar o valor
1
para o principalRouteID
, eu faria assim:Ele assume que há apenas duas linhas na tabela, se houver mais "outras" rotas, especifique seu específico
RouteID
emCROSS APPLY
vez de<> 1
obter apenas uma linha necessária.Aqui está o SQL Fiddle .