Sql 大表上的自连接
我有以下表格: 表1: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
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
我只想要那些记录,其中,curStatus是0和prevStatus是27,并且在两天之内,curStatus从0变为27和prevStatus从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天?或者他们在两天内改变了,或者彼此改变了?谢谢,伙计。这很有帮助。:)