4

こんにちは、入力ごとに最新の既知の値のテーブルを取得する必要があります。

私はこれで始めました

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 and plantId = 1」の入力に属するすべての値を取得しました私の質問は、最新の[TimeStampUtc]を持つ値のみのテーブルを取得する方法です

つまり、'DayYield および plantId =1 という名前の入力に属し、最後にテーブルに挿入された [Val] をすべて取得します。

4

3 に答える 3

7

これには、たとえばランキング機能を使用できますROW_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

于 2013-04-28T11:26:49.637 に答える
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
于 2014-03-31T22:27:17.133 に答える