假设有这样一张门禁记录表,姓名,打卡地点,和日期,一个姓名可以有多个日期,那么,怎样查询一个姓名对应的最大日期的那一行记录呢?
以下介绍2种方法来实现。
首先创建测试表:
create table TableA
(
Names VARCHAR(20),GateNo INT ,D_Date date
)
INSERT INTO TableA VALUES('张三',1,'2017-09-30')
INSERT INTO TableA VALUES('张三',2,'2017-09-29')
INSERT INTO TableA VALUES('李四',2,'2017-09-30')
INSERT INTO TableA VALUES('李四',3,'2017-09-26')
INSERT INTO TableA VALUES('李四',2,'2017-09-15')
INSERT INTO TableA VALUES('张三',3,'2017-05-15')
方法一:使用MAX()函数来查询:
SELECT a.Names,a.GateNo,a.D_Date FROM dbo.TableA a WHERE a.D_Date = (SELECT MAX(b.D_Date) FROM dbo.TableA b WHERE a.Names=b.Names)
方法二:使用ROW_NUMBER()函数来查询:
SELECT a.Names,a.GateNo,a.D_Date
FROM (
SELECT Names,GateNo,D_Date,ROW_NUMBER() OVER(PARTITION BY Names ORDER BY D_Date DESC) AS rows
FROM dbo.TableA
) a WHERE a.rows = 1
效果如下图所示: