#sql #sql-server
#sql #sql-сервер
Вопрос:
Недавно я начал с SQL и пытаюсь получить все «ua_keys», сгенерированные случайной выборкой из 10 000 клиентов в течение месяца. При выполнении следующего SQL-запроса:
WITH
selected_users AS (
SELECT DISTINCT
user_id
FROM
oneapp_data.oa_events
WHERE
logtime BETWEEN '2020-10-01T21:59:57.940Z' AND '2020-11-01T22:59:58.027Z'
ORDER BY rand()
LIMIT 10000
)
SELECT
user_id,
ua_key
FROM
oa_events
WHERE
ua_key IN ( selected_users)
получение следующей ошибки:
Ошибка при выполнении запроса: SYNTAX_ERROR: строка 2: 4: для ВЫБОРА DISTINCT выражения ORDER BY должны отображаться в списке выбора
Есть идеи, как я могу это решить? Большое спасибо!!!
Комментарии:
1. Пометьте свой вопрос используемой базой данных.
2. Мне кажется, что ваше
rand()
поле в разделе ORDER BY должно быть частью результирующего набора, чтобы его можно было использовать вORDER BY
Ответ №1:
Вам необходимо добавить оператор SELECT подзапроса в предложение IN . Попробуйте выполнить следующее:
WITH
selected_users AS (
SELECT DISTINCT
user_id,
ua_key,
rand() random_value
FROM
oneapp_data.oa_events
WHERE
logtime BETWEEN '2020-10-01T21:59:57.940Z' AND '2020-11-01T22:59:58.027Z'
),
sampling_example AS(
SELECT
user_id,
ua_key,
random_value
FROM
selected_users
ORDER BY
random_value
LIMIT 10000
)
SELECT
user_id,
ua_key
FROM
oa_events
WHERE
ua_key IN (
SELECT ua_key
FROM sampling_example
)
Ответ №2:
Я думаю, это должно сработать:
WITH selected_users AS (
SELECT TOP (10000) distinct user_id
FROM oneapp_data.oa_events
WHERE logtime BETWEEN '2020-10-01T21:59:57.940Z' AND '2020-11-01T22:59:58.027Z'
ORDER BY NEWID()
)
SELECT user_id, ua_key
FROM oa_events
WHERE ua_key IN (SELECT user_id FROM selected_users);
Если исправление IN
предложения не работает, вы можете сделать:
WITH selected_users AS (
SELECT TOP (10000) user_id
FROM oneapp_data.oa_events
WHERE logtime BETWEEN '2020-10-01T21:59:57.940Z' AND '2020-11-01T22:59:58.027Z'
GROUP BY user_id
ORDER BY NEWID()
)
Комментарии:
1. @cherencia . . . Есть причина, по которой вы не приняли этот ответ?