SQLServer数据库获取重复记录中日期最新的记录

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 在日常的项目开发当中,经常会遇到获取同一属性相同的记录,如何获取记录时间最新的那一条,比如获取某个淘宝用户最新一次的购物记录,美团外卖获取用户最后一次的点外卖记录等等场景,下面通过简单的示例给大家提供三种比较常见的SQL写法,希望能给大家带来一些思路。

image_26e70f0f.png

在日常的项目开发当中,经常会遇到获取同一属性相同的记录,如何获取记录时间最新的那一条,比如获取某个淘宝用户最新一次的购物记录,美团外卖获取用户最后一次的点外卖记录等等场景,下面通过简单的示例给大家提供三种比较常见的SQL写法,希望能给大家带来一些思路。

1、建表脚本:记录的是当前用户的订单记录。如果某个人多次下单会出现某个人重复下订单的记录。脚本如下:

CREATE TABLE [dbo].[t\_expense\_record\_info](

[id] [int] IDENTITY(1,1) NOT NULL,

[goods\_id] [int] NULL,

[amount] [decimal](18, 6) NULL,

[expense\_time] [datetime] NULL,

[user\_id] [int] NULL,

[create\_date] [datetime] NULL,

CONSTRAINT [PK\_t\_expense\_record\_info] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD\_INDEX = OFF, STATISTICS\_NORECOMPUTE = OFF, IGNORE\_DUP\_KEY = OFF, ALLOW\_ROW\_LOCKS = ON, ALLOW\_PAGE\_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

SET IDENTITY\_INSERT [dbo].[t\_expense\_record\_info] ON

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (1, 100, CAST(5000.000000 AS Decimal(18, 6)), CAST(0x0000A9D900CDFE60 AS DateTime), 1, CAST(0x0000AB4700000000 AS DateTime))

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (2, 100, CAST(2000.000000 AS Decimal(18, 6)), CAST(0x0000AB460130DEE0 AS DateTime), 2, CAST(0x0000AB4700000000 AS DateTime))

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (3, 118, CAST(300.000000 AS Decimal(18, 6)), CAST(0x0000AB430130DEE0 AS DateTime), 1, CAST(0x0000AB4700000000 AS DateTime))

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (4, 20, CAST(1500.000000 AS Decimal(18, 6)), CAST(0x0000AB480130DEE0 AS DateTime), 2, CAST(0x0000AB4700000000 AS DateTime))

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (5, 300, CAST(100.000000 AS Decimal(18, 6)), CAST(0x0000AA860130DEE0 AS DateTime), 3, CAST(0x0000AB4700000000 AS DateTime))

INSERT [dbo].[t\_expense\_record\_info] ([id], [goods\_id], [amount], [expense\_time], [user\_id], [create\_date]) VALUES (6, 80, CAST(7000.000000 AS Decimal(18, 6)), CAST(0x0000AAD5013BDB60 AS DateTime), 1, CAST(0x0000AB4700000000 AS DateTime))

SET IDENTITY\_INSERT [dbo].[t\_expense\_record\_info] OFF

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'主键' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'id'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'商品id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'goods\_id'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'消费金额' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'amount'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'消费时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'expense\_time'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'消费者id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'user\_id'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info', @level2type=N'COLUMN',@level2name=N'create\_date'

GO

EXEC sys.sp\_addextendedproperty @name=N'MS\_Description',

@value=N'消费记录表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't\_expense\_record\_info'

GO

SELECT * FROM t\_expense\_record\_info ORDER BY user\_id;

执行SQL查询结果如下图:

image_244e7200.png

方法1:

SELECT a.* FROM t\_expense\_record\_info a

LEFT JOIN t\_expense\_record\_info b ON a.user\_id = b.user\_id AND a.expense\_time < b.expense\_time

WHERE b.id IS NULL ORDER BY a.user\_id;

方法2:

select * from t\_expense\_record\_info a

where a.expense\_time in

(select max(b.expense\_time) from t\_expense\_record\_info b where b.user\_id=a.user\_id)

ORDER BY a.user\_id;

方法3:

select * from t\_expense\_record\_info a where not exists

(select 1 from t\_expense\_record\_info b where b.user\_id=a.user\_id and b.expense\_time>a.expense\_time)

ORDER BY a.user\_id;

最终执行结果如图:

image_af60a225.png

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 安全 算法
【SQL server】玩转SQL server数据库:第四章 数据库安全性
【SQL server】玩转SQL server数据库:第四章 数据库安全性
69 12
|
1月前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
60 11
|
1月前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
105 6
|
4天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
7 0
|
4天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
11天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
17天前
|
SQL 调度 数据库
【Database】Sqlserver如何定时备份数据库和定时清除
【Database】Sqlserver如何定时备份数据库和定时清除
24 2
|
24天前
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
2天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
10 0
|
2天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections