Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL内部连接与前1_Sql_Sql Server 2008_Tsql - Fatal编程技术网

SQL内部连接与前1

SQL内部连接与前1,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,嗨,我需要为每个输入获取一个最新已知值的表 我是从这个开始的 SELECT [MeterReadingId] ,[TimeStampUtc] ,[Val] ,[MeterReading].[InverterInputId] ,[Status] FROM [Project].[dbo].[MeterReading] inner join InverterInput on [MeterReading].InverterInputId = [In

嗨,我需要为每个输入获取一个最新已知值的表

我是从这个开始的

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
当然,现在我得到了所有属于name'DayYield和plantId=1输入的值 我的问题是,如何仅获取具有最新[TimeStampUtc]的值的表


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

一个选项是交叉应用,如:

select  *
from    Devices d
cross apply
        (
        select  top 1 *
        from    Measurements m
        where   m.device_id = d.id
        order by
                m.timestamp desc
        ) m
例如,您可以使用,
行编号()。大概是这样的:

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;
使用m.[TimeStampUtc]DESC的
订单将为您提供最新的
[TimeStampUtc]

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

我发现交叉应用函数更容易阅读。这还意味着您需要维护普通查询的基本结构

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
更新cc
设置cc.OutCC=oocd.cc,cc.Outcel=oocd.cel,
cc.Outcd=oocd.cd,cc.Outrn=oocd.rn,
cc.outidate=oocd.idate,cc.outtdate=oocd.tdate
来自@CbC cc
交叉申请(
从@OutC ocd中选择顶部1*
其中,子字符串(ocd.rn,LEN(ocd.rn)-9,9)=子字符串(cc.rn,LEN(cc.rn)-9,9)和(cc.idate和DATEADD(hh,1,cc.idate)之间的ocd.cdate)以及ocd.cdate
我想第一个单词应该是bu,不管怎样,这个查询都会返回所有时间戳的所有行,而不是只返回最新的行,对于上面不需要RN=1的查询,所有行都有RN=1。不清楚这个答案与原始答案的关系question@SvenHavgen不清楚,;什么是正常的SQL结构?您可能希望包括对推荐的交叉应用方法的引用,并说明使用此函数将如何帮助实现OP返回不同结果的目标。()