我试图一次从桌子上获取2行。具有上周最短日期时间(今天 - 7)和最新日期(今天)的那个 我的表:
|id |dataIn |dataOut|date |MachineId |
-----+-------+-------+-----------------------+-------------------------------------+
|1 |5006 |58 |2011-10-25 09:03:17.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559
|2 |1200 |130 |2011-10-26 12:45:43.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559
...
|124 |1350 |480 |2011-10-29 13:29:04.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559
|125 |8005 |560 |2011-10-31 21:18:35.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559
我可以选择上周的数据:
SELECT
dbo.myDatabase.Date AS [date], dbo.myDatabase.dataIn AS [in],
dbo.myDatabase.dataOut AS [out]
FROM
dbo.myDatabase WHERE
Date >=dateadd(day,datediff(day,0,GetDate())- 7,0)
AND
dbo.myDatabase.MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559'
但我只想要第1行和第125行,因为这些是用于我计算的行。
所以我的问题是:
如何从上一个查询的结果中选择2行(带有MIN和MAX日期)?
答案 0 :(得分:5)
如果您有多个具有相同日期的行,此查询将确保仅为最小/最大值返回一行(仅适用于Sql 2005 +)。
;WITH dates
AS (SELECT dbo.Mydatabase(id) AS id,
dbo.mydatabase.DATE AS [date],
dbo.mydatabase.datain AS [in],
dbo.mydatabase.dataout AS [out],
Row_number() OVER (ORDER BY DATE ASC) AS row
FROM dbo.mydatabase
WHERE DATE >= Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 7, 0)
AND dbo.mydatabase.machineid =
'7B788EE88E-6527-4CB4-AA4D-01B7F4048559'),
dates2
AS (SELECT id,
DATE,
in,
OUT,
row,
MIN(row) OVER (PARTITION BY (SELECT NULL)) AS lowest_row,
MAX(row) OVER (PARTITION BY (SELECT NULL)) AS highest_row
FROM dates)
SELECT id,
DATE,
in,
OUT
FROM dates2
WHERE row = lowest_row
OR row = highest_row
答案 1 :(得分:2)
你可以用这个:
select * from dbo.myDatabase
where
([Date] = (select max([Date]) from /* your query */ ) or
[Date] = (select min([Date]) from /* your query */ ))
and MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559' -- or any other id
修改,因为两台计算机完全可能具有相同的date
值,因此应更新查询以在MachineId
中包含where
过滤器}子句。我更新了查询以显示此信息。
答案 2 :(得分:0)
通过阅读注释,并且每台机器都在执行自己的INSERT,插入不会为引擎处理的自动增量列插入值。因此,除非机器正在更改其日期/时间,否则在自动增量ID与PER MACHINE基础上的日期/时间之间存在直接关联。那么,那就是说,我创建的样本获得了每个机器的最小和最大ID,其中日期/时间是合格的将导致所讨论范围的确定的第一个和最后一个ID。然后,您可以获得特定的ID记录。
所以,如果你有3台机器,并且它们在同一时间插入,那么它们各自的ID将以不同的方式生成......
|id |date |MachineId |
-----+-------+-------+-----------------
|1 |2011-10-25 09:03:17.000| A
|2 |2011-10-25 09:03:17.000| B
|3 |2011-10-25 09:03:17.000| C
|4 |2011-10-26 12:45:43.000| B
|5 |2011-10-26 12:45:43.000| A
|6 |2011-10-26 12:45:43.000| C
...
|124 |2011-10-29 13:29:04.000| C
|125 |2011-10-29 13:29:04.000| A
|126 |2011-10-29 13:29:04.000| B
|127 |2011-10-31 21:18:35.000| C
|128 |2011-10-31 21:18:35.000| B
|129 |2011-10-31 21:18:35.000| A
The first and last IDs per respective machine would become
Machine First ID Last ID
A 1 129
B 2 128
C 3 127
内部预查询完成一次(按特定机器),因此您将获得与机器日期/时间段的第一个/最后一个实例关联的ID。然后将其连接到表中以获取ID匹配的OR的实际数据。
select
D2.*
FROM
( SELECT
min( D1.ID ) MinDateID,
max( D1.ID ) MaxDateID
from
dbo.myDatabase D1
where
D1.MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559'
AND D1.Date >=dateadd(day,datediff(day,0,GetDate())- 7,0)
) PreQuery
JOIN dbo.MyDatabase D2
on PreQuery.MinDateID = D2.ID
OR PreQuery.MaxDateID = D2.ID