Есть ли способ использовать параметры в подзапросе с groupby и в запросе sql? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь использовать ранг для получения ранга для каждого алфавита и выбрать этот ранг при наличии функции, используя параметры

Пример: Вот мои данные таблицы:

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 Как добавить параметры в запрос выше?

Ответы [ 3 ]

0 голосов
/ 30 января 2020

Я не совсем понимаю, что вы хотите, но я подозреваю, что вы спрашиваете, что вы можете уменьшить количество возвращаемых строк только для указанного c алфавита для указанного c года. Нечто подобное должно работать для вас.

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
0 голосов
/ 30 января 2020

Я хочу получить самую последнюю дату и время для вышеупомянутого запроса, поэтому я определяю рейтинг пользователя, чтобы отфильтровать самый последний рейтинг. Кроме того, я использовал Группировать, чтобы сгруппировать свой ранг по алфавиту:

Используя Группировать по:

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. Как выбрать конкретный алфавит и самую последнюю дату для этого алфавита с помощью параметра?

0 голосов
/ 30 января 2020

Вы можете добавить предложение 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. Поскольку у вас есть необработанные данные, а не сводные данные, и вы возвращаете только 1 строку для каждого alphabet, используя where RankOrder = 1.

Примечание: Вы не можете использовать INT Alphabet в качестве базовой таблицы содержит текстовое значение. Итак, измените тип переменной @palphabet.

...