2011-06-07 61 views
1

我有我試圖與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 

站ID在這種情況下,選擇第一條記錄我要選擇的結果的第二行數據集。我如何使用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 =最小值(si.CreatedDate)更新的臨時表 我得到的follwing錯誤: 聚合不應出現在UPDATE語句的設置列表中。

任何指針?

+0

我重新標記爲'SQL服務器'在你的問題歷史的引導下,如果它錯了,請自己糾正。請記住,SQL不屬於Microsoft ;-) – 2011-06-07 16:55:26

+0

@report_out的結構是什麼,它有多行?它看起來像你想要每一行更新到站2的最短日期是否正確? – eoldre 2011-06-07 17:02:42

回答

3

至於我可以計算出,一聚合不能用在更新語句中,因爲聚合和更新會影響兩個不同的行集。想想一個普通的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 
+0

@P爸爸,工作!似乎有更好的辦法,但爲了我的理解程度,它是完美的。感謝您的幫助,我在這樣做的過程中學到了一些好東西。 – zach 2011-06-07 18:35:29

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不是候選鍵......查詢變慢。

0

如果你只是想用站ID「2」,並且具有最小日期的記錄,只是嘗試:

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

這種方式消除了分組

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 
0

一些數據塊(尤其是MySQL的)更短的聲明可能是:

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