llopx

能跟您分享知识,是我的荣幸

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 标签: sql2005,t-sql,query

posted on 2010-02-26 10:29  llopx  阅读(348)  评论(0编辑  收藏  举报

导航