选择数据集中的最小日期

时间:2011-06-07 16:45:58

标签: sql sql-server

我有一个数据集,我试图选择站号为2的第一个记录。

InspectionNbr   Station          DateTimeStamp
825065             1            2010-11-16 04:38:49.000
825065             2            2010-11-16 12:38:31.000
825065             2            2010-12-06 01:35:14.000
825065             2            2011-01-24 08:11:04.000

在这种情况下,我想选择结果的第二行。如何使用SQL获取stationid = 2的最小日期?

如上所述,这就是我所拥有的。 我在SQL中创建了一个临时表。我已设置为使用最新日期填充表格。然后我尝试使用以下代码

更新临时表
UPDATE @report_out 
 set    
DateTimeStamp = Min(si.CreatedDate)
 from
@report_out as r
 INNER JOIN
StationInspection as si
    on si.ModifiedDate = r.DateTimeStamp
where
r.Station = 2

由于某些原因,我不喜欢DateTimeStamp = Min(si.CreatedDate) 我得到了以下错误: 聚合可能不会出现在UPDATE语句的集合列表中。

任何指针?

5 个答案:

答案 0 :(得分:3)

据我所知,聚合不能在update语句中使用,因为聚合和更新会影响两个不同的行集。考虑使用聚合的正常SELECT:

SELECT MIN(CreatedDate)
FROM StationInspection
WHERE Station = 2

聚合适用于行集中的所有行。行集由WHERE子句确定,该子句确定行集中的行。

在更新语句中,WHERE子句确定将更改哪些行

UPDATE StationInspection
SET CreatedDate = @newDate
WHERE Station = 2

更新会影响行集中的所有行(通过WHERE子句指定的过滤器的所有行)。

所以,在你尝试这两种情况的情况下(我意识到这在某种程度上比你的代码简化了,但它确实如此):

UPDATE StationInspection
SET CreatedDate = MIN(CreatedDate)
WHERE Station = 2

您有两个操作需要唯一的行集,但只有一个行集选择器(WHERE子句)。

SQL在单个语句中不支持两个WHERE子句。所以你需要两个陈述:

DECLARE @newDate datetime

SELECT @newDate = SELECT MIN(CreatedDate)
FROM StationInspection
WHERE Station = 2

UPDATE StationInspection
SET CreatedDate = @newDate
WHERE Station = 2

答案 1 :(得分:1)

如果DateTimeStap是候选键(至少在使用Station编写时),则无需创建临时表;只是做:

Select a.* from a join 
(select a.Station, Min(a.DateTimeStamp) as m group by a.Station) as b 
on a.Station = b.Station and a.DateTimeStamp = b.m

然后你有所有电台的StationID和最小DateTimeStamp。这是一个快速查询。

如果DateTimeStamp不是候选键...查询变慢。

答案 2 :(得分:0)

如果您只想获取电台ID为“2”并且日期最短的唱片,请尝试:

SELECT InspectionNbr, Station, DateTimeStamp
FROM   StationInspection
WHERE  Station = 2
AND    DateTimeStamp = (
                          SELECT MIN(DateTimeStamp) 
                          FROM   StationInspection 
                          WHERE  Station = 2
                       )

这样可以消除分组

答案 3 :(得分:0)

select T.InspectionNbr,
       T.Station,
       T.DateTimeStamp
from (
       select *,
              row_number() over(order by DateTimeStamp) as rn
       from StationInspection
       where Station = 2
     ) as T
where T.rn = 1  

答案 4 :(得分:0)

某些DB(特别是MySQL)的简短陈述可能是:

SELECT   InspectionNbr, Station, DateTimeStamp
FROM     StationInspection
WHERE    Station = 2
ORDER BY DateTimeStamp ASC
LIMIT    1