SQL:如何进行查询,从表的数据中返回每个用户上次创建的行
考虑下表的数据SQL:如何进行查询,从表的数据中返回每个用户上次创建的行,sql,sql-server-2008,select,last-modified,Sql,Sql Server 2008,Select,Last Modified,考虑下表的数据 ID UserID ClassID SchoolID Created 2184 19313 10 28189 2010-10-25 14:16:39.823 46697 19313 10 27721 2011-04-04 14:50:49.433 •47423 19313 11 27721 2011-09-15 09:15:51.740 •47672 19881 11
ID UserID ClassID SchoolID Created
2184 19313 10 28189 2010-10-25 14:16:39.823
46697 19313 10 27721 2011-04-04 14:50:49.433
•47423 19313 11 27721 2011-09-15 09:15:51.740
•47672 19881 11 42978 2011-09-19 17:31:12.853
3176 19881 11 42978 2010-10-27 22:29:41.130
22327 19881 9 45263 2011-02-14 19:42:41.320
46661 32810 11 41861 2011-04-04 14:26:14.800
•47333 32810 11 51721 2011-09-13 22:43:06.053
131 32810 11 51721 2010-09-22 03:16:44.520
我想进行一个sql查询,为每个用户标识返回最后创建的行,其中的结果如下:在上面的行中,以•开头的行:
ID UserID ClassID SchoolID Created
47423 19313 11 27721 2011-09-15 09:15:51.740
47672 19881 11 42978 2011-09-19 17:31:12.853
47333 32810 11 51721 2011-09-13 22:43:06.053
您可以将CTE公用表表达式与行数函数一起使用:
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum')
FROM dbo.YourTable
)
SELECT
ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
这个CTE根据用户ID对数据进行分区,对于每个分区,ROW_NUMBER函数都会给出顺序号,从1开始,按Created DESC排序-因此,对于每个用户标识,最新一行的RowNum=1,这是我在后面的select语句中从CTE中选择的。您可以使用CTE公用表表达式和row_NUMBER函数:
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum')
FROM dbo.YourTable
)
SELECT
ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
这个CTE根据用户ID对数据进行分区,对于每个分区,ROW_NUMBER函数都会按顺序编号,从1开始,按Created DESC排序-因此最新的一行为每个用户ID获取RowNum=1,这是我在后面的select语句中从CTE中选择的。我知道这是一个老问题,但我在MySQL中遇到了同样的问题,我想我已经找到了一种标准的sql方法来实现这一点。我只是用MySQL测试过,但我不相信我使用的是任何MySQL特有的东西
select mainTable.* from YourTable mainTable, (
select UserID, max(Created) as Created
from YourTable
group by UserID
) dateTable
where mainTable.UserID = dateTable.UserID
and mainTable.Created = dateTable.Created
我知道这是一个老生常谈的问题,但我在MySQL中也遇到了同样的问题,我想我已经找到了一种标准的sql方法来解决这个问题。我只是用MySQL测试过,但我不相信我使用的是任何MySQL特有的东西
select mainTable.* from YourTable mainTable, (
select UserID, max(Created) as Created
from YourTable
group by UserID
) dateTable
where mainTable.UserID = dateTable.UserID
and mainTable.Created = dateTable.Created
只是想知道,你怎么知道最后创建的ID是哪一个?因为用户ID 32810突出显示46661而不是47333?或者这是你的错误?由于该数字较高且创建日期晚于46661?@Tjekkles,很抱歉我错了,我用正确的数据更新了问题。。我只是想知道,你怎么知道最后创建的ID是哪一个?因为用户ID 32810突出显示46661而不是47333?或者这是你的错误?由于该数字较高且创建日期晚于46661?@Tjekkles,很抱歉我错了,我用正确的数据更新了问题。。thnx