Sql server SQL查询以获取每分钟的最后一条记录

Sql server SQL查询以获取每分钟的最后一条记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个表,它每秒钟都会更新一些值。我想检索每分钟的最后一条记录 我尝试过这个代码,但是它返回了所有的记录 SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus FROM brands t0 WHERE t0.cdt BETWEEN '2013-11-15' and '2014-11-15' GROUP BY t0.brandID, t0.brandName, t0.cdt

我有一个表,它每秒钟都会更新一些值。我想检索每分钟的最后一条记录

我尝试过这个代码,但是它返回了所有的记录

SELECT 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus  
FROM 
    brands t0 
WHERE  
    t0.cdt BETWEEN '2013-11-15' and '2014-11-15' 
GROUP BY 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus,(datepart(minute, t0.cdt) / 1)
我的表格结构是:

ID  brandname     cdt                          udt  brandstatus addedby
1   khasim  2013-11-01 19:14:18.120 2013-11-15 19:14:18.123 1   1
2   khasim  2013-11-01 19:14:18.121 2013-11-15 19:14:18.123 1   1
3   khasim  2013-11-01 19:14:18.122 2013-11-15 19:14:18.123 1   1          
4   khasim  2013-11-01 19:14:18.123 2013-11-15 19:14:18.123 1   1
5   khasim  2013-11-02 19:17:57.700 2013-11-15 19:17:57.700 1   2
6   tanveer 2013-11-03 19:18:05.947 2013-11-15 19:18:05.947 1   2
7   abcdef  2013-11-04 20:50:06.783 2013-11-15 20:50:06.787 1   4
预期结果是:

 ID  brandname     cdt                          udt  brandstatus addedby

    4   khasim  2013-11-01 19:14:18.123 2013-11-15 19:14:18.123 1   1
    5   khasim  2013-11-02 19:17:57.700 2013-11-15 19:17:57.700 1   2
    6   tanveer 2013-11-03 19:18:05.947 2013-11-15 19:18:05.947 1   2
    7   abcdef  2013-11-04 20:50:06.783 2013-11-15 20:50:06.787 1   4

使用
ROW\u NUMBER
添加编号并按
分区:

WITH Cte AS(
    SELECT *,
        rn = ROW_NUMBER() OVER(
                PARTITION BY brandname, DATEADD(MINUTE, DATEDIFF(MINUTE, 0, cdt), 0)
                ORDER BY cdt DESC
             )
    FROM tbl
)
SELECT
    ID, brandname, cdt, udt, brandstatus, addedby
FROM Cte
WHERE rn = 1
ORDER BY Id
这:


cdt
四舍五入到最近的一分钟,即
2013-11-01 19:14:18.123
2013-11-01 19:14:00.000

您可以使用以下查询:

SELECT ID, brandname, cdt, udt, brandstatus, addedby
FROM (
  SELECT ID, brandname, cdt, udt, brandstatus, addedby,
         ROW_NUMBER() OVER (PARTITION BY brandname, 
                                         CAST(udt AS DATE),
                                         CONVERT(VARCHAR(5), udt, 114) 
                            ORDER BY udt DESC) AS rn
  FROM brands) AS t
WHERE t.rn = 1
本部分:

CONVERT(VARCHAR(5), udt, 114)
用于从
udt
字段提取小时和分钟。

请尝试下面的查询

    SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus FROM brands t0 WHERE t0.cdt BETWEEN '2013-11-15' and '2014-11-15' 
  and t0.cdt in (select MAX(cdt) from brands group by (CONVERT(CHAR(16),cdt,120)));

DATEPART(分钟,cdt)
也将获得分钟部分是的,当然是分钟部分。但这将破坏分区。我想我的措辞很糟糕。你的解决方案正是我所寻找的,但你所说的弄乱分区是什么意思?我已将分区更改为cdt(日期时间),并检查没有任何问题。如果您单独按
DATEPART(MINUTE,cdt)
进行分区,那么我应该指定我所说的“中间”日期。如何每5分钟间隔或“n”分钟间隔修改上述查询请您简要解释一下,因为我每天每小时都要这样做,在两个日期之间的每一分钟,您都在按品牌名称进行分区。我们可以按cdt(datetime)进行分区吗?@Tan
行数
应用于具有相同(1)
brandname
,(2)
date
from
udt
和(3)hour,minute from
udt
的记录分区(片)。对于每一个这样的分区,都会选择最新的记录。您可以在cdt上应用相同的功能。
    SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus FROM brands t0 WHERE t0.cdt BETWEEN '2013-11-15' and '2014-11-15' 
  and t0.cdt in (select MAX(cdt) from brands group by (CONVERT(CHAR(16),cdt,120)));