2013-04-28 99 views
4

您好,我需要爲每個輸入獲取最新已知值的表格。頂部的SQL內部連接1

我開始用這個

SELECT [MeterReadingId] 
     ,[TimeStampUtc] 
     ,[Val] 
     ,[MeterReading].[InverterInputId] 
     ,[Status] 
    FROM [Project].[dbo].[MeterReading] 
    inner join InverterInput on [MeterReading].InverterInputId = [InverterInput].InverterInputId 
    inner join Inverter on [InverterInput].InverterId = [Inverter].InverterId 
    where [InverterInput].InputName = 'DayYield' and [Inverter].PlantId = 1 

關當然,現在我有屬於名稱輸入的所有值「DayYield和plantId = 1 我的問題是如何能拿到的只是那些有最新的[值表TimeStampUtc]

其他詞:得到屬於名稱'DayYield和plantId = 1的輸入並且最後插入到表中的所有[Val]。

回答

7

對於這一點,你可以使用ranking functionsROW_NUMBER()例如。事情是這樣的:

WITH CTE 
AS 
(
    SELECT [MeterReadingId] 
      ,[TimeStampUtc] 
      ,[Val] 
      ,m.[InverterInputId] 
      ,[Status] 
      ,ROW_NUMBER() OVER(PARTITION BY m.InverterInputId 
          ORDER BY m.[TimeStampUtc] DESC) AS RN 
     FROM [Project].[dbo].[MeterReading] AS m 
     inner join InverterInput AS ii on m.InverterInputId = ii.InverterInputId 
     inner join Inverter  AS i on ii.InverterId  = i.InverterId 
     where ii.InputName = 'DayYield' and i.PlantId = 1 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 

使用ORDER BY m.[TimeStampUtc] DESC會給你最新的[TimeStampUtc]

需要注意的是:我不知道你正在使用的表的結構,但您可能需要由 PARTITION BY子句中使用另一個列組,而不是 MeterReadingId

+0

我想,第一個單詞應該與任何方式這個查詢返回我所有的行與所有時間戳,而不是最新的,並且對於WHERE RN = 1以上的查詢是不需要的,所有行都有rn = 1 – kosnkov 2013-04-28 11:34:59

+0

多數民衆贊成它,謝謝非常! – kosnkov 2013-04-28 11:45:56

+0

@kosnkov - 隨時歡迎您:) – 2013-04-28 11:47:46

9

一個選擇是cross apply,如:

select * 
from Devices d 
cross apply 
     (
     select top 1 * 
     from Measurements m 
     where m.device_id = d.id 
     order by 
       m.timestamp desc 
     ) m 
+0

爲了便於閱讀,我個人比較喜歡這個選項。 – 2013-04-28 11:35:39

0

我發現交叉應用函數更容易閱讀。這也意味着您維護普通查詢的基本結構。

update cc 
set cc.OutCC = oocd.CC, cc.Outcel = oocd.cel, 
    cc.Outcd = oocd.cd, cc.Outrn = oocd.rn, 
    cc.outidate = oocd.idate, cc.outtdate = oocd.tdate 
from @CbC cc 
cross apply ( 
    select top 1 * from @OutC ocd 
    where substring(ocd.rn,LEN(ocd.rn) - 9,9) = substring(cc.rn,LEN(cc.rn) - 9,9) and (ocd.cdate between cc.idate and DATEADD(hh,1,cc.idate)) and ocd.cdate < cc.tdate and ocd.cel like '%' + cc.line + '%' collate database_default 
order by ocd.idate 
) oocd 
+0

不清楚這個答案與原始問題的關係 – Nathan 2014-03-31 22:49:27

+0

@SvenHavgen目前尚不清楚;什麼是正常的SQL結構?您可能希望包含對您推薦的CROSS APPLY方法的引用,並指示如何使用此函數將有助於實現OP返回不同結果的目標。 (http://sqlserverplanet.com/sql-2005/cross-apply-explained) – 2014-03-31 23:06:06