Sql 大表上的自连接

Sql 大表上的自连接,sql,sql-server,join,Sql,Sql Server,Join,我有以下表格: 表1: dateField | curStatus | prevStatus | statusChangeDate 2015-01-15 | 0 | 27 | 2015-01-15 2015-01-16 | 27 | 0 | 2015-01-16 2015-01-17 | 0 | 27 | 20

我有以下表格:

表1:

dateField   |   curStatus   |   prevStatus   |   statusChangeDate

2015-01-15  |      0        |      27        |   2015-01-15
2015-01-16  |      27       |      0         |   2015-01-16
2015-01-17  |      0        |      27        |   2015-01-17
2015-01-18  |      27       |      0         |   2015-01-18
我只想要那些记录,其中,curStatus0prevStatus27,并且在两天之内,curStatus从0变为27prevStatus从27变为0

该表包含大量数据

我尝试了以下问题:

SELECT A.dateField, B.dateField, A.curStatus, B.curStatus, A.prevStatus, B.prevStatus 
FROM table1 A, table1 B
WHERE A.curStatus = 27 and A.prevStatus = 0
AND B.curStatus = 0 AND B.prevStatus = 27 AND CONVERT(DATE,B.statusChangeDate) <= CONVERT(DATE,DATEADD(d, -2, GETDATE()))
选择A.dateField、B.dateField、A.curStatus、B.curStatus、A.prevStatus、B.prevStatus
从表1 A到表1 B
其中A.curStatus=27,A.prevStatus=0

和B.curStatus=0和B.prevStatus=27和CONVERT(DATE,B.statusChangeDate)如果只有两种类型:0和27,并且您需要从最近两天(从当前日期)获取更新的记录,您可以简单地使用下面的代码。但是如果您有更多的类型,您将需要一些东西来标识行,例如主键

create table st27 

(

datafield datetime,

curstatus int,

prevstatus int,

statuschangedate datetime

)

insert into st27 VALUES ('2015-01-15'  ,      0       ,     27,   '2015-01-15')
insert into st27 VALUES ('2015-01-16'  ,      27      ,      0         ,   '2015-01-16')

insert into st27 VALUES ('2015-01-17'  ,      0        ,      27        ,   '2015-01-17')

insert into st27 VALUES ('2015-01-18'  ,      27       ,      0         ,   '2015-01-18')


select *,datediff(d,statuschangedate, getdate())  from st27 where curstatus = 27 and prevstatus = 0  and datediff(d,statuschangedate, getdate()) <= 2
创建表st27
(
数据字段日期时间,
curstatus int,
PrevInt状态,
statuschangedate日期时间
)
插入st27值('2015-01-15',0,27',2015-01-15')
插入st27值('2015-01-16',27,0',2015-01-16')
插入st27值('2015-01-17',0,27',2015-01-17')
插入st27值('2015-01-18',27,0',2015-01-18')
从st27中选择*,datediff(d,statuschangedate,getdate()),其中curstatus=27,prevstatus=0,datediff(d,statuschangedate,getdate())尝试交叉应用:

SELECT 
  A.dateField, B.dateField, A.curStatus, B.curStatus, A.prevStatus, B.prevStatus 
FROM 
  table1 A
CROSS APPLY
(
-- consider using
--  SELECT top 1 dateField, curStatus, prevStatus 
-- if you only want 1 row for each match
SELECT dateField, curStatus, prevStatus 
FROM table1
WHERE 
  dateField BETWEEN a.dateField and dateadd(d, 2, a.dateField) AND 
  curStatus = 0 and prevStatus = 27
-- in case you just want 1 row
-- ORDER BY datefield --(or whatever you want to order by)
) B
WHERE A.curStatus = 27 and A.prevStatus = 0

当然,它会给你一个笛卡尔积。您没有加入表。@a\u horse\u和\u no\u名称:一个可能的解决方案会有很大帮助。我不明白您为什么要加入表。您有此记录的ID吗?如果您可以包含一些不包含在结果中的数据,这会有帮助。您试图返回的数据不清楚。对他们不断变化的要求感到非常困惑。从当前日期算起2天?或者他们在两天内改变了,或者彼此改变了?谢谢,伙计。这很有帮助。:)