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

简介: 在日常的项目开发当中,经常会遇到获取同一属性相同的记录,如何获取记录时间最新的那一条,比如获取某个淘宝用户最新一次的购物记录,美团外卖获取用户最后一次的点外卖记录等等场景,下面通过简单的示例给大家提供三种比较常见的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

相关文章
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1902 152
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1313 156
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
954 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
1230 10
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
581 5
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
1697 0
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
881 0
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
716 158
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。