我有一个数据集,我试图选择站号为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语句的集合列表中。
任何指针?
答案 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