SQL - Как добавить строки между диапазоном чисел и сделать их значение 0 - PullRequest
0 голосов
/ 05 августа 2020

SQL Запрос, с которым я работаю

Результат из таблицы

То, что я пытаюсь выполнить sh, это то, что вместо того, чтобы просто иметь значения для мест, где фактически подсчитывается num_opens, я бы хотел, чтобы он показывал все потенциальные значения num_opens между минимальным и максимальным значением, а их общее количество равнялось 0. Например, на фотографии мы видим скачок между

num_opens: 7 Всего: 1

num_opens: 10 Всего: 1

Но я бы хотел, чтобы это было

num_opens: 7 Всего: 1

num_opens: 8 Всего: 0

num_opens: 9 Всего: 0

num_opens: 10 Итого: 1

и аналогично для всех потенциал num_open значения между минимальным и максимальным (11-15, 15-31, 31-48). Это сложно, потому что каждый день максимальное значение может быть другим (сегодня максимальное значение 48, а завтра может быть 37), поэтому мне нужно как-то вытащить максимальное значение.

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вы можете использовать generate_array() и unnest():

select num_opens, count(t.num_opens)
from (select min(num_opens) as min_no, max(num_opens) as max_no
      from t
     ) x cross join
     unnest(generate_array(t.min_no, t.max_no)) num_opens left join
     t
     on t.num_opens = num_opens
group by num_opens;
  
0 голосов
/ 05 августа 2020

Для начала вам понадобится справочная таблица. Из вашего изображения у вас есть что-то под названием users, но на самом деле подойдет любая (достаточно большая) таблица.

Итак, для начала вы создадите справочную таблицу, используя функцию rank() или row_count(). Или, если в вашем users.id нет пробелов, это еще проще использовать.

SELECT *, rank() OVER (ORDER BY id) as reference_value FROM users

Это сгенерирует таблицу 1....n для users.

Теперь вы присоединяетесь к этому, но отсчитываете от объединенной таблицы:

SELECT 
    a.reference_value, count(b.num_opens) as total
FROM   
     (SELECT rank() OVER (ORDER BY id) as reference_value from users) a
LEFT JOIN 
     [whatever table] b ON a.reference_value = b.num_opens
GROUP BY 
   a.reference_value

Но это слишком много строк! У вас определенно больше пользователей, чем рассчитано этим событием. Так что добавьте туда быстрый фильтр.

SELECT 
    a.reference_value, count(b.num_opens) as total
FROM   
     (SELECT rank() OVER (ORDER BY id) as reference_value from users) a
LEFT JOIN 
     [whatever table] b ON a.reference_value = b.num_opens
WHERE
     a.reference_value <= (SELECT max(num_opens) FROM [whatever table])
GROUP BY 
   a.reference_value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...