我的最终目标是比较两行(只存在两行)和特定类型,并确定其行值是否大于其他行类型值。我想出的结果似乎很笨拙,这让我想知道是否可以用更快或更优雅的方式完成。
我在这里创建了 sql fiddle来演示这个问题。
假设我们正在运送货物,我们的类型 1 的主要路线需要与其他路线类型 2 进行比较。每条路线都有一个 Wave 值和一个 Roll 值,需要独立比较。请注意,其他路线类型(除了 main,它始终使用)可以与Main
类型值 1 进行比较,但一次只能比较两个。
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)
根据表中当前的值,我们预计 MainsWave 将大于其他波浪,而 Roll 则相反。
这是工作的 sql,请注意,真正的最终结果只与IsMainWaveGreater
和有关,IsMainRollGreater
但所有列都显示用于调试:
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;
由于可以先读取并连接到下一行的行可能不是主路由(记住RouteID
main 中的值始终为1 ),因此 sql 必须有一个IIF
检查 Max1 是什么类型然后相应地交换检查/结果.
这可以优化甚至重写吗?
这只是 CTE 过程中的一个操作,因此可以进行其他操作。
每个表有两行,任何方法都可以。
由于您可以
1
对 main 的值进行硬编码,因此RouteID
我会这样做:它假定表中只有两行,如果有更多“其他”路由,则
RouteID
在CROSS APPLY
而不是<> 1
只获取需要的一行。这是SQL 小提琴。