Стратифицированная случайная выборка для соответствия другой таблице в BigQuery - PullRequest
0 голосов
/ 11 февраля 2020

Это должно быть простое расширение этого вопроса , но мой результат неверен, и я не могу понять это. Мне бы хотелось, чтобы пропорции в таблице, из которой я рисую, соответствовали пропорциям другой таблицы. Я также хотел бы разделить его на две категории. Я думаю, что это должно быть что-то вроде:

WITH table AS (
  SELECT *
  FROM `another_table` a
), table_stats AS (
  SELECT *, SUM(c) OVER() total 
  FROM (
    SELECT cat1, cat2, COUNT(*) c 
    FROM table
    GROUP BY cat1, cat2
    HAVING c>1000000)
)

SELECT COUNT(*) samples, cat1, cat2, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (
  SELECT id, cat1, cat2, c  
  FROM table `fh-bigquery.reddit_comments.2018_09`
  JOIN table_stats b
  USING(cat1, cat2)
  WHERE RAND()< 1000/total
)
GROUP BY 2, 3

Это должно дать около 1000 строк, но результат намного выше, и вычисление процента отключено.

1 Ответ

2 голосов
/ 11 февраля 2020

Я думаю, что ваше rand() сравнение отключено:

WITH table AS (
      SELECT a.*
      FROM `another_table` a
     ),
    table_stats AS (
       SELECT cc.*, SUM(c) OVER () as total 
       FROM (SELECT cat1, cat2, COUNT(*) as c 
             FROM table
             GROUP BY cat1, cat2
             HAVING c > 1000000
            ) cc
      )
SELECT COUNT(*) as num_samples, cat1, cat2, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (SELECT id, cat1, cat2, c  
      FROM (select t.*, COUNT(*) OVER () as t_total,
                   COUNT(*) OVER (PARTITION BY cat1, cat2) as tcc_total
            from table `fh-bigquery.reddit_comments.2018_09` t
           ) t JOIN
           table_stats b
           USING (cat1, cat2)
      WHERE RAND() < (1000.0 / t.t_total) * (c / total) / (tcc_total / t_total)
     ) t
GROUP BY 2, 3;

Обратите внимание, что вам нужен общий размер таблицы second , чтобы получить правильный (приблизительно) размер выборки.

Это тоже случайно. Если вы действительно хотите получить стратифицированную выборку, то вы должны сделать nth выборку для набора заказов. Если это вас интересует, задайте новый вопрос с соответствующими образцами данных, желаемыми результатами и пояснениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...