我是否接近这个? 我正在尝试列出包含“Ape”的所有记录......以及所有记录 在任何“Ape”记录之前x天发生的记录。 我想我需要一个自联接表?
-- Doesn't work:
SELECT tblA.MyDate, tblA.MyPet FROM TestTable As tblA WHERE tblA.MyPet='Ape'
UNION
SELECT tblA.MyDate, tblA.MyPet FROM TestTable AS tblA, TestTable AS tblB WHERE tblA.MyPet='Ape' AND tblA.MyDate>tblB.MyDate-0.5 AND tblA.MyDate<tblB.MyDate
ORDER BY tblA.MyDate ASC
-- Doesn't work:
SELECT * FROM TestTable As tblA INNER JOIN TestTable As tblB ON tblA.MyPet = 'Ape' AND tblA.MyDate>tblB.MyDate-1 AND tblA.MyKey>tblB.MyKey
-- Doesn't work:
SELECT * FROM TestTable WHERE MyDate IN (SELECT MyDate-1 FROM TestTable WHERE MyPet='Ape')
-- Doesn't work
SELECT id, uid, date FROM orders current
WHERE EXISTS
(
SELECT * from orders future
WHERE future.date < DateAdd(DAYS, 1, current.date)
AND future.date > getdate()
AND future.uid = current.uid
)
-- Doesn't work
SELECT * FROM TestTable AS tblA
WHERE EXISTS
(
SELECT * FROM TestTable AS tblB
WHERE tblB < DateAdd(DAYS, 1, tblA.MyDate)
AND tblB.MYDate > GetDate()
AND tblA.MyKey = tblB.MyKey
)
===========================以下是表格:
CREATE TABLE TestTable
(
MyKey Int IDENTITY(1,1) PRIMARY KEY,
MyDate DateTime NOT NULL DEFAULT GetDate(),
MyPet VarChar(22) NOT NULL DEFAULT ''
)
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 06:12:10', 'Cat' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 10:11:10', 'Dog' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 14:13:10', 'Fish' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 16:14:10', 'Duck' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 17:15:10', 'Bird' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('01-Dec-2012 20:16:10', 'Kitten')
INSERT INTO TestTable(MyDate, MyPet) VALUES('02-Dec-2012 01:17:10', 'Dog' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('02-Dec-2012 12:19:10', 'Fish' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('02-Dec-2012 13:20:10', 'Duck' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('02-Dec-2012 14:21:10', 'Bird' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('02-Dec-2012 16:18:10', 'Cat' ) -- These are within 1 day before any "Ape" record
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 05:26:10', 'Dog' ) --
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 11:22:10', 'Kitten') --
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 12:23:10', 'Duck' ) --
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 13:24:10', 'Bird' ) --
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 14:25:10', 'Ape' ) -- An "Ape" record
INSERT INTO TestTable(MyDate, MyPet) VALUES('03-Dec-2012 16:27:10', 'Cat' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('04-Dec-2012 01:32:10', 'Dog' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('04-Dec-2012 04:28:10', 'Fish' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('04-Dec-2012 07:30:10', 'Bird' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('04-Dec-2012 10:31:10', 'Kitten')
INSERT INTO TestTable(MyDate, MyPet) VALUES('04-Dec-2012 16:29:10', 'Duck' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('05-Dec-2012 11:35:10', 'Kitten')
INSERT INTO TestTable(MyDate, MyPet) VALUES('05-Dec-2012 12:36:10', 'Duck' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('05-Dec-2012 13:33:10', 'Duck' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('05-Dec-2012 13:37:10', 'Bird' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('05-Dec-2012 14:34:10', 'Dog' )
INSERT INTO TestTable(MyDate, MyPet) VALUES('06-Dec-2012 04:41:10', 'Fish' ) -- These are within 1 day before any "Ape" record
INSERT INTO TestTable(MyDate, MyPet) VALUES('06-Dec-2012 05:39:10', 'Dog' ) --
INSERT INTO TestTable(MyDate, MyPet) VALUES('06-Dec-2012 14:38:10', 'Kitten') --
INSERT INTO TestTable(MyDate, MyPet) VALUES('06-Dec-2012 16:40:10', 'Ape' ) -- An "Ape" record
INSERT INTO TestTable(MyDate, MyPet) VALUES('06-Dec-2012 16:42:10', 'Duck' )
答案 0 :(得分:2)
这就是你想要的:
SELECT DISTINCT
tblA.*
FROM TestTable AS tblA
INNER JOIN TestTable AS tblB
ON (tblA.MyDate >= DATEADD(day, -1, tblB.MyDate)) AND (tblA.MyDate <= tblB.Mydate) AND (tblB.MyPet = 'Ape');
这是工作SQLFiddle。
<强>更新强>
根据下面的戈登评论添加了DISTINCT
。
答案 1 :(得分:1)
我认为您正在寻找的配方是:
SELECT *
FROM TestTable tblA
WHERE EXISTS (SELECT *
FROM TestTable tblB
WHERE tblB.mydate between tblA.MyDate - X and tblA.MyDate and
tblB.MyPet = 'Ape'
)
两个音符。首先,它使用语法“date - x”,当日期为datetime
但不是date
时,该语法有效。它相当于dateadd(day, -x, tbla.MyDate)
。
其次,这将返回带有'Ape'的所有记录,因为between
处理相等。
Jesse的查询基本上使用外连接和distinct进行相同的操作。
答案 2 :(得分:0)
答案 3 :(得分:0)
查询1 :
-- Doesn't work:
SELECT tblA.MyDate, tblA.MyPet
FROM TestTable As tblA
WHERE tblA.MyPet='Ape'
UNION all
SELECT tblA.MyDate, tblA.MyPet
FROM TestTable AS tblA
WHERE dateadd(day, 1, tblA.MyDate) < (select min(MyDate) from TestTable where MyPet = 'Ape')
ORDER BY tblA.MyDate ASC
<强> Results 强>:
| MYDATE | MYPET |
--------------------------------------------
| December, 01 2012 06:12:10+0000 | Cat |
| December, 01 2012 10:11:10+0000 | Dog |
| December, 01 2012 14:13:10+0000 | Fish |
| December, 01 2012 16:14:10+0000 | Duck |
| December, 01 2012 17:15:10+0000 | Bird |
| December, 01 2012 20:16:10+0000 | Kitten |
| December, 02 2012 01:17:10+0000 | Dog |
| December, 02 2012 12:19:10+0000 | Fish |
| December, 02 2012 13:20:10+0000 | Duck |
| December, 02 2012 14:21:10+0000 | Bird |
| December, 03 2012 14:25:10+0000 | Ape |
| December, 06 2012 16:40:10+0000 | Ape |
修改强>
如果您需要在第一次Ape记录前的期间发生记录 那么查询应该是(例如x = 1)
SELECT tblA.MyDate, tblA.MyPet
FROM TestTable As tblA
WHERE tblA.MyPet='Ape'
UNION
SELECT tblA.MyDate, tblA.MyPet
FROM TestTable AS tblA
WHERE (select min(MyDate) from TestTable where MyPet = 'Ape') between tblA.MyDate and dateadd(day, 1, tblA.MyDate)
ORDER BY tblA.MyDate ASC