在日常的項目開發當中,經常會遇到獲取同一屬性相同的記錄,如何獲取記錄時間最新的那一條,比如獲取某個淘寶用戶最新一次的購物記錄,美團外賣獲取用戶最后一次的點外賣記錄等等場景,下面通過簡單的示例給大家提供三種比較常見的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查詢結果如下圖:
方法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;
最終執行結果如圖: