SQL Server:在select之前排序行

时间:2014-04-22 13:06:45

标签: sql sql-server sql-order-by

无法理解这一点。我需要在耗材用完之前选择下订单的所有记录。例如,如果某人在2014年1月1日订购了30天的供应,然后在使用25%的供应量之前订购另外30天的供应量,则将其视为重复订单。我现在拥有的是嵌套选择:

USE petsnmore
  SELECT * 
      INTO duplicates_2014
      FROM orders a
      WHERE EXISTS
         (SELECT * 
             FROM orders b
             WHERE a.ID!=b.ID AND
                   a.claim_num = b.claim_num AND
                   a.service_id = b.service_id AND
                   a.visit_num = b.visit_num AND
                   b.dos BETWEEN a.dos AND DateAdd(dd,FLOOR(a.days_supply*.25),a.dos) 
         )

返回的行不是预期的,我认为是因为行没有按正确的顺序进行比较。我认为它需要:

        Order by claim_num ASC, service_id ASC, dos ASC, visit_num DESC 

当然,SQL Server只允许外部选择ORDER。我知道必须有更好的方法。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:0)

您可以使用表变量(或临时表,如果您想多次查询结果)来订购数据,然后使用该表连接回原始查询并查看可以从那里开始的位置。

declare @duplicateorders table (<fields from orders table>)
SELECT * into @duplicateorders
         FROM orders b
         WHERE a.ID!=b.ID AND
               a.claim_num = b.claim_num AND
               a.service_id = b.service_id AND
               a.visit_num = b.visit_num AND
               b.dos BETWEEN a.dos AND DateAdd(dd,FLOOR(a.days_supply*.25),a.dos)
         ORDER BY claim_num ASC, service_id ASC, dos ASC, visit_num DESC 

答案 1 :(得分:0)

您可以使用CTE(在CTE附近进行排序或在插入时结束:

;WITH (myCTE)
 AS
 (
  SELECT * 
  FROM orders a
  WHERE EXISTS
     (SELECT * 
         FROM orders b
         WHERE a.ID!=b.ID AND
               a.claim_num = b.claim_num AND
               a.service_id = b.service_id AND
               a.visit_num = b.visit_num AND
               b.dos BETWEEN a.dos AND DateAdd(dd,FLOOR(a.days_supply*.25),a.dos) 
     )
  )
  Select
        *
  INTO 
        duplicates_2014
  from
        myCTE