Запрос Microsoft Access для получения случайных транзакций с, казалось бы, невозможными критериями

Меня попросили помочь в разработке отчета для получения 25% выборки случайных транзакций в течение определенного диапазона дат. Я не программист, но я смог довольно быстро разработать следующее:

SELECT TOP 25 PERCENT account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init 
FROM account INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY log.tran_dt

Это возвращает 25% записей в диапазоне дат. Каждая строка записи уникальна, но каждый номер счета потенциально может иметь несколько записей каждый день. В некоторых случаях записи имеют одинаковую дату и tran_id.

После дальнейшего обсуждения с отправителем запроса он на самом деле хочет увидеть все транзакции для 25% аккаунтов, в которых есть активность каждый день в пределах диапазона дат. Таким образом, если на 01.03.2018 было 100 учетных записей с записями в этой таблице, он хочет увидеть все транзакции для 25 из этих учетных записей; если на 02.03.2018 было 60 учетных записей с записями в этой таблице, он хочет увидеть все транзакции для 15 из этих учетных записей; и так далее.

Я думал, что модуль доступа будет работать лучше всего в этом сценарии, поскольку я считаю, что он состоит из нескольких частей. Я понял, что мне нужна функция для перебора диапазона дат и для каждого дня: 1. Подсчет номеров счетов только один раз 2. Возврат всех транзакций для 25% от общего числа счетов.

Но, как я уже говорил, я не программист, и я устал от поиска возможных решений для многих частей.


person S. H.    schedule 20.06.2018    source источник
comment
Как правильно задать вопрос по SQL. Демонстрационные данные и ожидаемый результат гораздо полезнее, чем текстовое описание.   -  person Andre    schedule 21.06.2018


Ответы (1)


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

Что-то вроде этого должно работать - я предполагаю, что ваше поле actiontxt является текстовым полем, и я вытаскиваю длину каждого поля и применяю ее к текущей дате/времени, чтобы создать псевдослучайное число, которое можно отсортировать.

Все, что я действительно делаю, это меняю твою ORDER BY строку

Посмотрите, работает ли это для вас

SELECT TOP 25 PERCENT 
account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, 
log.to_data, log.tran_id, log.init 
FROM account 
INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY Rnd(CLng(Now()*Len(log.action_txt))-(Now()*Len(log.action_txt)));

Изменена аналогичная идея из другого вопроса и ответа StackOverflow

person dbmitch    schedule 21.06.2018