SQL选择具有最大和最小日期的行

use*_*612 4 sql

我试图一次从桌子上获得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日期)?

vla*_*lad 6

你可以使用这个:

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子句中也包含过滤器。我更新了查询以显示这一点。


Dib*_*tar 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 
Run Code Online (Sandbox Code Playgroud)