2017-02-13 37 views
0
BatteryId TimeStamp     Temprature 
1   2017-02-13 12:16:14.000  23 
1   2016-02-13 12:13:14.000  21 
1   2015-01-13 12:16:14.000  19 
2   2017-02-11 12:16:14.000  22 
2   2016-02-13 12:16:14.000  16 
3   2017-02-13 11:16:14.000  12 
3   2016-02-13 12:15:14.000  25 

我有多个记录,每个电池如上 下面的SQL查询表对每个电池选择最新的记录使用SQL与计数每个电池

SELECT * FROM (SELECT BatteryId, Timestamp, Temperature 
ROW_NUMBER() OVER(PARTITION BY BatteryId ORDER BY timestamp DESC) 
AS N FROM tblBattery) AS TT WHERE N = 1 

返回最新的纪录

BatteryId TimeStamp     Temprature 
1   2017-02-13 12:16:14.000  23 
2   2017-02-11 12:16:14.000  22 
3   2017-02-13 11:16:14.000  12 

如何为每个BatteryId添加Count,以下是我需要的内容

BatteryId TimeStamp     Temprature Count 
1   2017-02-13 12:16:14.000  23   3 
2   2017-02-11 12:16:14.000  22   2 
3   2017-02-13 11:16:14.000  12   2 
+0

我删除了mysql标签,因为语法看起来像sql-server。 –

+0

这里有问题吗? – OldProgrammer

+0

肯定是从Tajinder看到下面的答案 –

回答

2

使用count窗口功能。

SELECT * FROM 
(SELECT BatteryId, Timestamp, Temperature, 
ROW_NUMBER() OVER(PARTITION BY BatteryId ORDER BY timestamp DESC) AS N, 
COUNT(*) OVER(PARTITION BY BatteryId) as Cnt 
FROM tblBattery) TT 
WHERE N = 1 
+1

我想你贴的答案和我的答案是一样的。当我们贴上答案时,时间有点不同。 – Tajinder

+0

这是Tajinder的复制答案 – sumit

+0

fyi..this的答案被张贴了40秒之前的其他..你可以按最旧的页面排序查看。 –

2

希望,我明白你的问题正确。

请检查以下查询是否可以帮到你。

SELECT * 
FROM 
    (SELECT BatteryId, 
    TIMESTAMP, 
    Temperature , ROW_NUMBER() OVER(PARTITION BY BatteryId ORDER BY TIMESTAMP DESC) AS N , 
    COUNT(0) OVER(PARTITION BY BatteryId) CNT 
    FROM tblBattery 
) AS TT 
WHERE N = 1; 
+0

@SqlZim是的,谢谢。现在更新。 – Tajinder

+0

谢谢@Tajinder正是我所期待的。 –

+0

您应该将此答案标记为正确,第二个答案只是第一个答案。 – sumit

0

添加一个子查询执行分区之前BY

SELECT * 
FROM (SELECT 
     BatteryId 
     ,Timestamp 
     ,Temperature 
     ,Count 
     ,ROW_NUMBER() OVER(PARTITION BY BatteryId ORDER BY timestamp DESC) AS N 
FROM (SELECT *, COUNT(BatteryId) As Count FROM tblBattery GROUP BY BatteryId)) AS TT WHERE N = 1 

这应该解决您的问题。