无法理解这一点。我需要在耗材用完之前选择下订单的所有记录。例如,如果某人在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。我知道必须有更好的方法。有什么想法吗?
由于
答案 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