SQL内部联接与前1名

kos*_*kov 4 sql t-sql sql-server-2008

嗨,我需要为每个输入获取最新已知值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
Run Code Online (Sandbox Code Playgroud)

当然,现在我得到的所有值都属于名称'DayYield和plantId = 1的输入我的问题是如何才能得到那些最新的值[TimeStampUtc]

换句话说:获取属于名称'DayYield和plantId = 1的输入的所有[Val]并最后插入表中.

And*_*mar 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
Run Code Online (Sandbox Code Playgroud)


Mah*_*mal 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;
Run Code Online (Sandbox Code Playgroud)

使用ORDER BY m.[TimeStampUtc] DESC会给你最新的[TimeStampUtc].

请注意:我不知道您正在使用的表的结构,但您可能需要在PARTITION BY子句中使用另一列来分组而不是MeterReadingId.