说,我有一个结构“table_name”如下:
+-----------+---------+--------------+-------+
| parent_id | file_id | created_date |Records|----- More Columns -----
+-----------+---------+--------------+-------+
| 42 | 32 | 12/01/2016 | 254 |
| 45 | 33 | 23/04/2016 | 256 |
| 41 | 34 | 12/01/2016 | 213 |
| 42 | 35 | 18/11/2015 | 271 |
| 41 | 36 | 07/07/2016 | 198 |
| 42 | 37 | 23/04/2016 | 186 |
| 45 | 38 | 30/06/2016 | 211 |
| 42 | 39 | 29/05/2016 | 192 |
+-----------+---------+--------------+-------+
我希望查询返回具有最后日期和最后一个file_id的记录,即根据上述数据的结果应返回以下内容:
+-----------+---------+--------------+-------+
| parent_id | file_id | created_date |Records|----- More Columns -----
+-----------+---------+--------------+-------+
| 42 | 34 | 12/01/2016 | 213 |
| 42 | 35 | 18/11/2015 | 271 |
| 41 | 36 | 07/07/2016 | 198 |
| 45 | 37 | 23/04/2016 | 186 |
| 45 | 38 | 30/06/2016 | 211 |
| 42 | 39 | 29/05/2016 | 192 |
+-----------+---------+--------------+-------+
注意 file_id:32 非如何被视为 12/01/2016 的最新file_id条目 34 ,返回 34 ,而不是 32 。类似地,对于 file_ids:33& 37 , 37 被认为是 37> 34 即可。
现在我正在使用子查询,如下所示:
select max(file_ids)
from table_name
where created_date in (
select max(created_date) from table_name
);
但是这种方法花了很多时间,比如10k记录大约需要5-6分钟。
答案 0 :(得分:2)
您可以使用ROW_NUMBER
:
SELECT file_id, created_date, Records
FROM (
SELECT file_id, created_date, Records,
ROW_NUMBER() OVER (PARTITION BY file_id
ORDER BY created_date DESC) AS rn
FROM mytable ) AS t
WHERE t.rn = 1
以上查询选择每file_id
答案 1 :(得分:0)
您也可以将CTE与row_number一起使用。
Declare @Table Table(parent_id int,file_id int,created_date date,Records int)
insert into @Table values
(42,32,' 2016/01/12 ',254)
,(45,33,'2016/04/23',256)
,(41,34,'2016/01/12',213)
,(42,35,'2015/11/18',271)
,(41,36,'2016/07/07',198)
,(42,37,'2016/04/23',186)
,(45,38,'2016/06/30',211)
,(42,39,'2016/05/29',192)
;WITH t
AS (
SELECT parent_id,file_id
,created_date
,records
,row_number() OVER (
partition by created_date ORDER BY created_date DESC,file_id desc
) rn
from @Table
)
SELECT parent_id,file_id
,created_date
,records
FROM t
WHERE rn = 1
order by file_id
答案 2 :(得分:0)
为了进行比较,您可以尝试运行这样的查询:
select t.*
from t
where t.created_date = (select max(t2.created_date)
from t t2
where t2.file_id = t.file_id
);
对于此版本和row_number()
版本,您需要t(file_id, created_date)
上的索引。我很好奇你的情况是否会更快。