sql - 列出另一组记录 x 小时内发生的所有 SQL 记录

标签 sql sql-server select nested-sets self-join

我已经接近这个目标了吗?
我正在尝试列出包含“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'  )

最佳答案

这就是你想要的:

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

关于sql - 列出另一组记录 x 小时内发生的所有 SQL 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144776/

相关文章:

sql - com.microsoft.sqlserver.jdbc.SQLServerException : Connection reset by peer: socket write error in grails app with sql server 2008

sql - 行到列数据

sql - 如何在 SQL Server 的存储过程中从 xml 节点创建游标?

SQL Server 2008 日期参数

php - 选择查询中的日期比较返回错误结果

mysql - 在 Drupal 中创建(折线图)图表(使用 mysql 数据源)时要考虑的任何 forena 替代方案?

sql - OUTER JOIN 中的条件给出与 WHERE 条件中不同的结果

sql-server - SQLCLR 静态类构造函数中的数据访问

sql - 列出工资在 30000-50000 之间的临时或兼职员工的 EMPNAME、PHONE、EMAIL - 根据 CITY、FACULTY 和 EMPID 排列

mysql_query ORDER BY 1 行中相互划分的元素的平均值