Синтаксическая ошибка SQL: ВЫБЕРИТЕ DISTINCT, ПОРЯДОК выражений должен отображаться в списке выбора

#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 . . . Есть причина, по которой вы не приняли этот ответ?