Некоторые rating
возвращают null
из-за left join
Попробуйте это
SELECT a.name,
ROUND(AVG(CASE WHEN c.rating IS NULL THEN 1 ELSE c.rating END )) AS rating,
a.etc,b.etc,a.personid
FROM person a
JOIN bid b ON b.personid=a.personid
LEFT JOIN rating c ON c.bidid=b.bidid
GROUP BY a.personid
просто замаскируйте 128-битное int
>>> import uuid
>>> uuid.uuid4().int & (1<<64)-1
9518405196747027403L
>>> uuid.uuid4().int & (1<<64)-1
12558137269921983654L
Они более или менее случайны, так что у вас есть крошечный шанс столкновения
Возможно, безопаснее использовать первые 64 бита uuid1
>>> uuid.uuid1().int>>64
9392468011745350111L
>>> uuid.uuid1().int>>64
9407757923520418271L
>>> uuid.uuid1().int>>64
9418928317413528031L
Они в значительной степени основаны на часы, поэтому случайность гораздо меньше, но уникальность лучше
Вы можете использовать uuid4()
, который генерирует один случайный 128-битный целочисленный UUID. Нам нужно 'двоичное правое смещение' (>>
) каждого 128-битного целого числа, сгенерированного 64-битным (то есть 128 - (128 - 64)
).
from uuid import uuid4
bit_size = 64
sized_unique_id = uuid4().int >> bit_size
print(sized_unique_id)
64 бита уникально
Что не так со счетом? Простой счетчик создаст уникальные значения. Это самый простой вариант, и вы можете быть уверены, что не будете повторять значение.
Или, если счет недостаточно хорош, попробуйте это.
>>> import random
>>> random.getrandbits(64)
5316191164430650570L
В зависимости от того, как вы набираете и используете свой генератор случайных чисел, он должен быть уникальным.
Конечно, вы можете сделать это неправильно и получить повторяющуюся последовательность случайных чисел. Следует проявлять особую осторожность при обращении с семенами для программы, которая запускается и останавливается.