作者:高远PASTOR | 来源:互联网 | 2023-08-23 11:33
Tiebreakers情况:即在某一条件相同的情况下(比如GROUPBY),在数据表里找到根据另外几个条件(先后关系)的最大(最小)值。作者展示了解决这样的问题的方法,这个方法的好处就是,
Tiebreakers情况:即在某一条件相同的情况下(比如GROUP BY),在数据表里找到根据另外几个条件(先后关系)的最大(最小)值。
作者展示了解决这样的问题的方法,这个方法的好处就是,不需要进行额外的INDEX的编码。
比如要达到这样一个查询:
SELECT EmployeeID, MAX(OrderDate, OrderID, CustomerID, RequiredDate)
FROM dbo.Orders
GROUP BY EmployeeID;
注意:上面的代码是错误的。
即查询除每个雇员的最新的订货日期(如果在相同的订货日期下选择最新的订单号,以此类推)。
可以这样写:
SELECT EmployeeID,
--注意:SUBSTRING(binstr,1,8)->从INDEX=1开始取字节,取的长度为8
CAST(SUBSTRING(binstr, 1, 8) AS DATETIME) AS OrderDate,
CAST(SUBSTRING(binstr, 9, 4) AS INT) AS OrderID,
CAST(SUBSTRING(binstr, 13, 10) AS NCHAR(5)) AS CustomerID,
CAST(SUBSTRING(binstr, 23, 8) AS DATETIME) AS RequiredDate
--子查询通过把N个属性进行2元的累加转化,然后取最大(实际上是取最后的订单日期)
FROM (SELECT EmployeeID,
MAX(CAST(OrderDate AS BINARY(8))
+ CAST(OrderID AS BINARY(4))
+ CAST(CustomerID AS BINARY(10))
+ CAST(RequiredDate AS BINARY(8))) AS binstr
FROM dbo.Orders
GROUP BY EmployeeID) AS D;
外查询实际上是剥离了内查询查出来的2元组合字符串,然后进行对应的分解,转化成应对的字符格式。
以上是几个条件(ORDERDATA,ORDERID,CUSTOMERID,REQUIREDDATE)依次排列取最大的情况,如果我们要使其中某一条件取最小的情况呢?
MAX(CAST(OrderDate AS BINARY(8))
+ CAST(2147483647 - OrderID AS BINARY(4))
+ CAST(CustomerID AS BINARY(10))
+ CAST(RequiredDate AS BINARY(8))) AS binstr
如上所示,用某值进行相减,即取到最小值。
Technorati 标签:
sql2005,
t-sql,
query