从每个月的所有可用行返回最后一天

时间:2014-06-15 16:40:18

标签: sql sql-server sql-server-2012

好的,这让我很难过......

我在下面的第一个查询会返回我感兴趣的所有可能的行。

首次查询

select * from FloatTable where Val > 0 and TagIndex = 325

下面我的第二个查询应该从所有可用行返回每个月的所有行(最后一天没有必要的日历,但数据库中存在任何最大值)。但是除了五月之外,我得到所有月份(整数值为5)。

第二次查询

select 
DateAndTime, TagIndex,Val
from FloatTable 
WHERE 
  (TagIndex = 325) AND 
  (Val > 0) AND 
  DateAndTime IN (Select Max(DateAndTime) from FloatTable 
                  group by month(DateAndTime), Year(DateAndTime)
                 )

使用SQL-Server 2012。

3 个答案:

答案 0 :(得分:2)

SELECT * 
FROM (
      select  DateAndTime, TagIndex,Val
        ,ROW_NUMBER() OVER (PARTITION BY MONTH(DateAndTime) ORDER BY DateAndTime DESC) RN 
      FROM FloatTable 
      WHERE TagIndex = 325 
        AND Val > 0
     )A
WHERE RN = 1

由于您使用的是SQL Server 2012,因此可以使用LAST_VALUE()之类的新窗口函数 FIRST_VALUE()

使用FIRST_VALUE()

SELECT *
FROM (
    SELECT  DateAndTime, TagIndex,Val
    ,FIRST_VALUE(DateAndTime) OVER (PARTITION BY MONTH(DateAndTime) 
                                           ORDER BY DateAndTime DESC) Last_Date 
    FROM FloatTable 
    WHERE TagIndex = 325 
    AND Val > 0
    ) A
WHERE DateAndTime = Last_Date

使用LAST_VALUE()

SELECT *
FROM (
    SELECT  DateAndTime, TagIndex,Val
    ,LAST_VALUE(DateAndTime) OVER (PARTITION BY MONTH(DateAndTime) ORDER BY DateAndTime 
              ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Last_Date 
    FROM FloatTable 
    WHERE TagIndex = 325 
    AND Val > 0
    ) A
WHERE DateAndTime = Last_Date

答案 1 :(得分:1)

您的第二个查询不起作用(正如您所期望的那样),因为您只将条件放在主查询中而不是子查询中。如果你添加它们,它将正常工作:

SELECT  
  DateAndTime, TagIndex, Val
FROM FloatTable 
WHERE 
  TagIndex = 325 AND 
  Val > 0 AND 
  DateAndTime IN 
    ( SELECT Max(DateAndTime) FROM FloatTable 
      WHERE TagIndex = 325 AND 
            Val > 0 
      GROUP BY Month(DateAndTime), Year(DateAndTime)
    ) ;

使用公用表表达式,它可能更具可读性:

; WITH cte AS
  ( SELECT  
      DateAndTime, TagIndex, Val
    FROM FloatTable 
    WHERE 
      TagIndex = 325 AND 
      Val > 0
  )
SELECT  
  DateAndTime, TagIndex, Val
FROM cte 
WHERE DateAndTime IN 
        ( SELECT Max(DateAndTime) FROM cte 
          GROUP BY Month(DateAndTime), Year(DateAndTime)
        ) ;

答案 2 :(得分:0)

试试这个!

因为您需要从所有记录

中返回的最后一天
select 
DateAndTime, TagIndex,Val
from FloatTable 
WHERE 
(TagIndex = 325) AND 
(Val > 0) AND 
DateAndTime=(select top 1 from FloatTable order by DateAndTime desc)

或尝试使用EOMONTH()功能

如果你在你的FloatTable 中每个月的最后一个日期 像这样

select 
    DateAndTime, TagIndex,Val
    from FloatTable 
    WHERE 
    (TagIndex = 325) AND 
    (Val > 0) AND 
    DateAndTime=EOMONTH(DateAndTime)