#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?