有没有办法在子查询中使用 group by 和 having sql 查询中的参数?
Is there a way to use parameters in subquery with groupby and having in sql query?
我正在尝试使用 rank 来获得每个字母表的排名,并且 select 使用参数
来排名
例如:
这是我的 table 数据:
Alphabet Date
A 2019-12-19 12:31:43.633
A 2019-12-19 12:31:43.650
B 2019-11-07 11:37:08.560
select *
from (select alphabet, date,
dense_Rank() over (partition by alphabet order by date) RankOrder
from mytable
) A
group by alphabet, date, RankOrder
having RankOrder = 1
通过使用上面的查询,这里是我的结果:
Alphabet Date Rank Order
A 2019-12-19 12:31:43.633 1
B 2019-11-07 11:37:08.560 1
如果我必须使用参数对多个字母执行此操作怎么办?
使用 declare @palphabet int='A',@pyear nvarchar(20)=2019
如何将参数添加到上述查询中?
您可以添加 where
子句:
select a.*
from(select alphabet,date,dense_Rank() over (partition by alphabet order by date) RankOrder
from mytable mt
where mt.Alphabet = @palphabet and year(mt.date) = @pyear
) a
where RankOrder = 1;
我认为这里不需要 GROUP BY
with HAVING
子句。由于您有原始数据而不是聚合数据,并且您使用 where RankOrder = 1
.
为每个 alphabet
仅返回 1 行
注意: 您不能使用 INT
Alphabet
因为基础 table 包含文本值。所以,改变变量的类型 @palphabet
.
我不完全清楚你想要什么,但我怀疑你是在问你可以减少返回的行,使其仅针对特定年份的特定字母表。像这样的东西应该适合你。
declare @mytable table (Alphabet char(1), MyDate Datetime)
insert @mytable values
('A', '2019-12-19 12:31:43.633')
, ('A', '2019-12-19 12:31:43.650')
, ('B', '2019-11-07 11:37:08.560')
declare @Alphabet char(1) = 'A'
, @Year int = 2019
select *
from
(
select t.Alphabet
, t.MyDate
, RankOrder = dense_Rank() over (partition by t.Alphabet order by t.MyDate)
from @mytable t
--filter the rows here instead of in the final select statement
where t.Alphabet = @Alphabet
and t.MyDate >= convert(char(4), @year) + '0101'
and t.MyDate <= convert(char(4), @year + 1) + '0101'
) A
where A.RankOrder = 1
我想获取上述查询的最新日期和时间,这就是我对用户排名过滤最新排名的原因。另外,我使用 Group by 根据字母表对我的排名进行分组:
使用分组依据:
A 2019-12-19 12:31:43.633 1
A 2019-12-19 12:31:43.650 2
A 2019-12-19 12:31:43.667 3
B 2019-11-07 11:37:08.560 1
B 2019-11-07 11:37:08.577 2
拥有允许我 select 只有我需要的等级 1。
A 2019-12-19 12:31:43.633 1
B 2019-11-07 11:37:08.560 1
C 2019-10-30 15:06:36.643 1
D 2019-11-05 16:16:17.920 1
如果我必须通过使用参数来做同样的事情。问题是我的参数是这种格式@date='F2019/2020',我的日期格式是 2019-12-19 12:31:43.633。如何使用参数 select 特定字母表和该字母表的最近日期?
我正在尝试使用 rank 来获得每个字母表的排名,并且 select 使用参数
来排名例如: 这是我的 table 数据:
Alphabet Date
A 2019-12-19 12:31:43.633
A 2019-12-19 12:31:43.650
B 2019-11-07 11:37:08.560
select *
from (select alphabet, date,
dense_Rank() over (partition by alphabet order by date) RankOrder
from mytable
) A
group by alphabet, date, RankOrder
having RankOrder = 1
通过使用上面的查询,这里是我的结果:
Alphabet Date Rank Order
A 2019-12-19 12:31:43.633 1
B 2019-11-07 11:37:08.560 1
如果我必须使用参数对多个字母执行此操作怎么办? 使用 declare @palphabet int='A',@pyear nvarchar(20)=2019 如何将参数添加到上述查询中?
您可以添加 where
子句:
select a.*
from(select alphabet,date,dense_Rank() over (partition by alphabet order by date) RankOrder
from mytable mt
where mt.Alphabet = @palphabet and year(mt.date) = @pyear
) a
where RankOrder = 1;
我认为这里不需要 GROUP BY
with HAVING
子句。由于您有原始数据而不是聚合数据,并且您使用 where RankOrder = 1
.
alphabet
仅返回 1 行
注意: 您不能使用 INT
Alphabet
因为基础 table 包含文本值。所以,改变变量的类型 @palphabet
.
我不完全清楚你想要什么,但我怀疑你是在问你可以减少返回的行,使其仅针对特定年份的特定字母表。像这样的东西应该适合你。
declare @mytable table (Alphabet char(1), MyDate Datetime)
insert @mytable values
('A', '2019-12-19 12:31:43.633')
, ('A', '2019-12-19 12:31:43.650')
, ('B', '2019-11-07 11:37:08.560')
declare @Alphabet char(1) = 'A'
, @Year int = 2019
select *
from
(
select t.Alphabet
, t.MyDate
, RankOrder = dense_Rank() over (partition by t.Alphabet order by t.MyDate)
from @mytable t
--filter the rows here instead of in the final select statement
where t.Alphabet = @Alphabet
and t.MyDate >= convert(char(4), @year) + '0101'
and t.MyDate <= convert(char(4), @year + 1) + '0101'
) A
where A.RankOrder = 1
我想获取上述查询的最新日期和时间,这就是我对用户排名过滤最新排名的原因。另外,我使用 Group by 根据字母表对我的排名进行分组:
使用分组依据:
A 2019-12-19 12:31:43.633 1
A 2019-12-19 12:31:43.650 2
A 2019-12-19 12:31:43.667 3
B 2019-11-07 11:37:08.560 1
B 2019-11-07 11:37:08.577 2
拥有允许我 select 只有我需要的等级 1。
A 2019-12-19 12:31:43.633 1
B 2019-11-07 11:37:08.560 1
C 2019-10-30 15:06:36.643 1
D 2019-11-05 16:16:17.920 1
如果我必须通过使用参数来做同样的事情。问题是我的参数是这种格式@date='F2019/2020',我的日期格式是 2019-12-19 12:31:43.633。如何使用参数 select 特定字母表和该字母表的最近日期?