SqlServer 2005 T-SQL Query 学习笔记(9)

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 标签: , ,

你可能感兴趣的:(sqlserver)