Способ функции окна коэффициента обновления

#mysql #sql

Вопрос:

У меня есть такой запрос, как

 select count(case when t.cnt > 1 then 1 end)/count(t.*)
from
(select signup_id, count(date_transaction) as cnt
from transactions
group by signup_id) t
 

Это дает мне норму продления в зависимости от того, имеет ли идентификатор регистрации более 1 значения или строки date_transaction

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

 select count(CASE WHEN t.rnk > 1 THEN 1 END) / count(t.*) as renewal_ratio
from
(select *, row_number() over (partition by signup_id order by date_transaction asc) rnk
from table) t
 

Комментарии:

1. Эти запросы не эквивалентны. Первый дает по одной строке на каждую signup_id , тогда как последний подсчитывает каждую строку, кроме самой первой. Видишь dbfiddle.uk/… PS. COUNT(t.*) неверно, вы должны использовать COUNT(*) .

2. спасибо, почему t.* неправильно использовать?, почему я не могу использовать псевдоним count (*), как я могу использовать псевдоним других столбцов, таких как rnk?

3. COUNT(*) подсчитывает количество строк в наборе строк. Но что COUNT(t.*) нужно учитывать? Если вы хотите подсчитать количество выходных строк, из которых взята соответствующая часть строки t , то вы должны подсчитывать не общую часть строки * , а какой-то определенный столбец или выражение (либо выражение PK, либо выражение, используемое в предложении ON).

4. итак, в приведенном выше примере использования используйте count(*) не с псевдонимом corect?