有没有一种方法可以在带有groupby的子查询中使用参数并在sql查询中使用参数?

时间:2020-01-30 16:49:47

标签: 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 (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

如果我必须使用参数对多个字母执行此操作怎么办? 使用声明@palphabet int ='A',@ pyear nvarchar(20)= 2019 如何将参数添加到上述查询中?

3 个答案:

答案 0 :(得分:0)

您可以添加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子句的HAVING。由于您拥有原始数据而不是汇总数据,因此您使用alphabet仅对每个where RankOrder = 1返回1行。

注意::由于基表包含文本值,因此不能使用INT Alphabet。因此,更改变量@palphabet的类型。

答案 1 :(得分:0)

我不确定您想要什么,但我怀疑您是在要求您将返回的行减少为仅针对特定年份的特定字母。这样的事情应该适合您。

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

答案 2 :(得分:0)

我想获取上述查询的最新日期和时间,这就是我使用用户等级来过滤最新等级的原因。另外,我使用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。如何使用参数选择特定字母和该字母的最新日期?