有没有一种方法可以将子查询中的参数与groupby一起使用,并在sql查询中使用have?

有没有一种方法可以将子查询中的参数与groupby一起使用,并在sql查询中使用have?,sql,sql-server,subquery,ssms,Sql,Sql Server,Subquery,Ssms,我试图使用秩来获得每个字母表的秩,并在使用参数的函数中选择该秩 例: 以下是我的表格数据: 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 (s

我试图使用秩来获得每个字母表的秩,并在使用参数的函数中选择该秩

例: 以下是我的表格数据:

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;
我认为这里不需要
groupby
HAVING
子句。由于您有一个原始数据,而不是聚合数据&使用
where RankOrder=1
,每个
字母表只返回一行


注意:您不能使用
INT
字母表,因为基表包含文本值。因此,更改变量的类型
@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
declare@mytable表(字母字符(1),MyDate-Datetime)
插入@mytable值
('A','2019-12-1912:31:43.633')
,('A','2019-12-1912:31:43.650')
,('B','2019-11-07 11:37:08.560')
声明@Alphabet char(1)='A'
,@Year int=2019年
选择*
从…起
( 
选择t字母表
,t.MyDate
,RankOrder=densite_Rank()over(按t.字母顺序按t.MyDate划分)
来自@myt表
--在此处而不是在最终select语句中筛选行
其中t.字母=@字母表
和t.MyDate>=转换(字符(4),@year)+'0101'

和t.MyDate我想获取上述查询的最新日期和时间,这就是我用户排名筛选排名最新的原因。此外,我使用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
拥有是允许我只选择排名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。我如何使用参数来选择特定的字母表和该字母表的最新日期?

不确定您在这里问什么。您是在问如何添加where子句吗到您的查询?参数可以在查询中的任何地方使用,它们不必在最后的
WHERE
中。我不太确定您在这里得到了什么。我认为您的变量数据类型是向后的。您不能使用as int。2019 as varchar在处理年份时没有任何意义。这应该是int。您通常可以使用我们在任何可以使用单个文字值的地方都可以使用一个参数;除了外来类型之外,我想不出有任何例外。不能使用参数的地方是表示列表或元组,或替换字段、表、数据库的标识符。@user12815148…请用多个“字母表”显示示例数据来解释你的意思。