好的,这让我很难过......
我在下面的第一个查询会返回我感兴趣的所有可能的行。
首次查询:
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。
答案 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)