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
fromudt
和(3)hour,minute fromudt
的记录分区(片)。对于每一个这样的分区,都会选择最新的记录。您可以在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)));