我试图一次从桌子上获得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
Run Code Online (Sandbox Code Playgroud)
我可以选择上周的数据:
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'
Run Code Online (Sandbox Code Playgroud)
但我只想要第1行和第125行,因为这些是用于计算的行.所以我的问题是:
如何从上一个查询的结果中选择2行(带有MIN和MAX日期)?
你可以使用这个:
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
Run Code Online (Sandbox Code Playgroud)
编辑:由于两台机器完全有可能具有相同的date
值,因此应更新查询MachineId
以在where
子句中也包含过滤器。我更新了查询以显示这一点。
如果您有多个具有相同日期的行,则此查询将确保仅为最小值/最大值返回一行(仅适用于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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38934 次 |
最近记录: |