Sql server 取按日期最大的一条记录

select * from T_Test A  where date=(select max(date) from T_Test B where A.[Name]=B.[Name])

原表记录



执行后结果

### SQL Server 按每小时抽一条记录 为了实现从 SQL Server 数据库中按每小时抽一条记录的目标,可以利用窗口函数 `ROW_NUMBER()` 和日期时间处理功能。以下是具体的解决方案: #### 使用 ROW_NUMBER() 实现每小时抽一条记录 通过 `ROW_NUMBER()` 函数为每一小时内的时间戳分配唯一的编号,并按照指定条件筛选出每小时的第一条记录。 ```sql WITH HourlyData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DATEADD(HOUR, DATEDIFF(HOUR, 0, YourDateTimeColumn), 0) ORDER BY YourDateTimeColumn ASC) AS RowNum FROM YourTableName WHERE YourDateTimeColumn >= '2023-10-01' AND YourDateTimeColumn < '2023-10-02' ) SELECT * FROM HourlyData WHERE RowNum = 1; ``` 上述代码解释如下: - **`DATEADD(HOUR, DATEDIFF(HOUR, 0, YourDateTimeColumn), 0)`**: 将时间截断到整点,用于分区操作。 - **`ROW_NUMBER() OVER (...)`**: 对每个时间段内的数据进行排序并标记序号。 - **`RowNum = 1`**: 筛选出每个小时中的第一条记录[^1]。 #### 动态调整时间范围 如果需要动态支持不同天数的数据提,可以通过修改 `WHERE` 子句中的时间范围来控制查询结果。例如,对于多日或多月的情况,只需扩展时间过滤器即可。 #### 处理跨数据库场景 当涉及跨数据库或服务器查询时,可借助链接服务器(Linked Server)技术完成复杂查询。具体方法参见相关内容[^2]。 --- ### 示例代码:每日、每月、每年抽单条记录 除了按小时抽外,还可以基于其他粒度设计类似的逻辑。以下提供几个常见案例: #### 每日抽一条记录 ```sql WITH DailyData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CAST(YourDateTimeColumn AS DATE) ORDER BY YourDateTimeColumn ASC) AS RowNum FROM YourTableName ) SELECT * FROM DailyData WHERE RowNum = 1; ``` #### 每月抽一条记录 ```sql WITH MonthlyData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY YEAR(YourDateTimeColumn), MONTH(YourDateTimeColumn) ORDER BY YourDateTimeColumn ASC) AS RowNum FROM YourTableName ) SELECT * FROM MonthlyData WHERE RowNum = 1; ``` #### 每年抽一条记录 ```sql WITH YearlyData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY YEAR(YourDateTimeColumn) ORDER BY YourDateTimeColumn ASC) AS RowNum FROM YourTableName ) SELECT * FROM YearlyData WHERE RowNum = 1; ``` 以上脚本均采用相同的思路——先定义一个 CTE 来计算行号,再从中选符合条件的结果集。 --- ### 注意事项 在实际应用过程中需要注意以下几点: - 如果表中有重复数据,则需明确如何选择其中的一条作为代表。 - 性能优化方面,建议索引覆盖主要字段(如时间列),以减少扫描开销。 - 当面对大规模历史数据时,考虑分批加载策略或者引入中间汇总表提升效率[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值