是否可以在没有子查询的情况下为每个组检索 top ROW_NUMBER() ?
Is it possible to to retrieve a top ROW_NUMBER() for each group without a sub-query?
本着简洁优美的编码精神,我想知道是否有人能够创建一个完全如下所示执行的查询,但没有子查询。
示例查询:
本质上,子查询是通过首先为每个患者排序和标记每一行来检索每个用户的最近日期,其中“1”是每个患者的最近日期。然后外部查询识别并 returns 每个“1”,这是与每个用户关联的最大日期。
SELECT user_name
,date
FROM(
SELECT user_name
,date
,row_number() OVER(PARTITION BY user_name ORDER BY date DESC) as row_num
FROM yourtable
) AS t
WHERE t.row_num = 1
数据示例预执行:
|user_name|date |
|Some1 |10/22|
|Some1 |10/27|
|Some1 |10/30|
|Some2 |10/30|
|Some2 |11/15|
|Some2 |11/18|
数据示例post-执行:
|user_name|date |
|Some1 |10/30|
|Some2 |11/18|
准备好让我的心被你们所有人震撼
您可以使用 WITH TIES
选项
Select top 1 with ties *
From yourtable
Order By row_number() OVER(PARTITION BY user_name ORDER BY date DESC)
对于您的示例,您可以使用 group by
:
select user_name, max(date)
from t
group by user_name;
您可以组合使用 SELECT DISTINCT
、LAST_VALUE
和 MAX() OVER
(指定 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)。像这样
数据
drop table if exists #tTable;
go
create table #tTable(
user_name varchar(100) not null,
dt date not null);
Insert into #tTable values
('Some1', '20201022'),
('Some1', '20201027'),
('Some1', '20201030'),
('Some2', '20201030'),
('Some2', '20201115'),
('Some2', '20201118');
查询
select distinct last_value(user_name) over (partition by user_name order by dt) as user_name,
max(dt) over (partition by user_name order by dt
rows between unbounded preceding
and unbounded following) as [date]
from #tTable;
输出
user_name date
Some1 2020-10-30
Some2 2020-11-18
本着简洁优美的编码精神,我想知道是否有人能够创建一个完全如下所示执行的查询,但没有子查询。
示例查询:
本质上,子查询是通过首先为每个患者排序和标记每一行来检索每个用户的最近日期,其中“1”是每个患者的最近日期。然后外部查询识别并 returns 每个“1”,这是与每个用户关联的最大日期。
SELECT user_name
,date
FROM(
SELECT user_name
,date
,row_number() OVER(PARTITION BY user_name ORDER BY date DESC) as row_num
FROM yourtable
) AS t
WHERE t.row_num = 1
数据示例预执行:
|user_name|date |
|Some1 |10/22|
|Some1 |10/27|
|Some1 |10/30|
|Some2 |10/30|
|Some2 |11/15|
|Some2 |11/18|
数据示例post-执行:
|user_name|date |
|Some1 |10/30|
|Some2 |11/18|
准备好让我的心被你们所有人震撼
您可以使用 WITH TIES
选项
Select top 1 with ties *
From yourtable
Order By row_number() OVER(PARTITION BY user_name ORDER BY date DESC)
对于您的示例,您可以使用 group by
:
select user_name, max(date)
from t
group by user_name;
您可以组合使用 SELECT DISTINCT
、LAST_VALUE
和 MAX() OVER
(指定 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)。像这样
数据
drop table if exists #tTable;
go
create table #tTable(
user_name varchar(100) not null,
dt date not null);
Insert into #tTable values
('Some1', '20201022'),
('Some1', '20201027'),
('Some1', '20201030'),
('Some2', '20201030'),
('Some2', '20201115'),
('Some2', '20201118');
查询
select distinct last_value(user_name) over (partition by user_name order by dt) as user_name,
max(dt) over (partition by user_name order by dt
rows between unbounded preceding
and unbounded following) as [date]
from #tTable;
输出
user_name date
Some1 2020-10-30
Some2 2020-11-18