列出在另一组记录的x小时内发生的所有SQL记录
我已经接近了吗?列出在另一组记录的x小时内发生的所有SQL记录,sql,sql-server,select,nested-sets,self-join,Sql,Sql Server,Select,Nested Sets,Self Join,我已经接近了吗? 我试图列出所有包含“猿”的记录。。。以及所有的 在任何“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, TestTa
我试图列出所有包含“猿”的记录。。。以及所有的 在任何“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
)
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');
选择DISTINCT
tblA*
作为tblA从测试表中删除
内部联接测试表作为tblB
在(tblA.MyDate>=DATEADD(day,-1,tblB.MyDate))和(tblA.MyDate
查询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
| 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天内发生的记录
那么查询应该是(在示例x=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”,当date是datetime
而不是date
时,该语法起作用。它相当于dateadd(day,-x,tbla.MyDate)
其次,这将返回所有带有“Ape”的记录,因为between
处理相等
Jesse的查询使用外部连接和distinct实现了本质上相同的功能。我不知道如何“编写两个部分”。(“然后用UNION连接它们”是最简单的部分。)代码+结果列出的记录比任何“ape”记录的前一天还要早(我看到12月3日的ape…然后是12月1日的记录。)…我对此进行了投票,但准确地说,它应该是选择distinct tblA.
,因为当多个记录匹配时,您将获得重复的记录。您不需要外部联接(您没有),因为原始记录将始终匹配。@GordonLinoff我将使用distinct
更新答案。谢谢!
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
SELECT *
FROM TestTable tblA
WHERE EXISTS (SELECT *
FROM TestTable tblB
WHERE tblB.mydate between tblA.MyDate - X and tblA.MyDate and
tblB.MyPet = 'Ape'
)