Ограничение Mysql необходимо вернуть n% случайных записей из таблицы - PullRequest
0 голосов
/ 25 июня 2018

полностью застрял, используйте разные подходы, но все же не повезло, я использую MySQl и SparkSql. У меня есть простой выбор

SELECT 
rdw.merchant_id, hash_id, transaction_ts 
FROM table_1 rdw
JOIN table_2 bl ON rdw.MERCHANT_ID = bl.MERCHANT_ID
WHERE brand = 'TBrand'
order by rand()
limit 36

, и это отлично работает, но вот проблема в limit 36 мне нужно выбрать30% от всех записей, я не могу передать число в нем, потому что не удалось спарк при работе с переменными.Япытаясь рассчитать% в пределе, но.его сейчас разрешено, есть идеи как загрузить?Проблема в том, что я не знаю, сколько записей будет возвращено select, поэтому я не могу установить лимит, это должно быть% от записей

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Если вы можете иметь дело с приблизительным 30%, вы можете просто сделать:

where brand = 'TBrand' and rand() <= 0.3

Если вам нужно лучшее приближение до 30%, тогда вы можете сделать:

SELECT x.*
FROM (SELECT rdw.merchant_id, hash_id, transaction_ts,
             (@rn := @rn + 1) as rn
      FROM table_1 rdw JOIN
           table_2 bl
           ON rdw.MERCHANT_ID = bl.MERCHANT_ID CROSS JOIN
           (SELECT @rn := 0) params
      WHERE brand = 'TBrand'
      ORDER BY rand()
     ) x
WHERE rn <= @rn * 0.30
0 голосов
/ 25 июня 2018
SET @row_number = 0;
select merchant_id, hash_id, transaction_ts  
from (
 SELECT 
(@row_number:=@row_number + 1) as num,
rdw.merchant_id, hash_id, transaction_ts 
FROM table_1 rdw
JOIN table_2 bl ON rdw.MERCHANT_ID = bl.MERCHANT_ID
WHERE brand = 'TBrand'
order by rand()
) 
where num <= FLOOR((@row_number * 3) /10  )
...