Считать разные в оконных функциях - PullRequest
1 голос
/ 12 октября 2019

Я пытался посчитать уникальный столбец b для каждого c, не делая group by. Я знаю, что это можно сделать с помощью join. как сделать подсчет (различный b) более (разделить с), не прибегая к присоединению. Почему счетчик не поддерживается в оконных функциях. Заранее спасибо. Учитывая этот фрейм данных:

val df= Seq(("a1","b1","c1"),
                ("a2","b2","c1"),
                ("a3","b3","c1"),
                ("a31",null,"c1"),
                ("a32",null,"c1"),
                ("a4","b4","c11"),
                ("a5","b5","c11"),
                ("a6","b6","c11"),
                ("a7","b1","c2"),
                ("a8","b1","c3"),
                ("a9","b1","c4"),
                ("a91","b1","c5"),
                ("a92","b1","c5"),
                ("a93","b1","c5"),
                ("a95","b2","c6"),
                ("a96","b2","c6"),
                ("a97","b1","c6"),
                ("a977",null,"c6"),
                ("a98",null,"c8"),
                ("a99",null,"c8"),
                ("a999",null,"c8")
                ).toDF("a","b","c");

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

количество уникальных столбцов b для каждого c без группирования по.

Типичным обходным решением SQL является использование подзапроса, который выбирает различающиеся кортежи, а затем число окон во внешнемзапрос:

SELECT c, COUNT(*) OVER(PARTITION BY c) cnt
FROM (SELECT DISTINCT b, c FROM mytable) x
0 голосов
/ 12 октября 2019

Некоторые базы данных поддерживают count(distinct) как оконную функцию. Есть две альтернативы. Одним из них является сумма плотных рангов:

select (dense_rank() over (partition by c order by b asc) +
        dense_rank() over (partition by c order by b desc) -
        1
       ) as count_distinct
from t;

Второй использует подзапрос:

select sum(case when seqnum = 1 then 1 else 0 end) over (partition by c)
from (select t.*, row_number() over (partition by c order by b) as seqnum
      from t
     ) t;
...