Ошибка оператора Group BY для получения уникальных записей - PullRequest
0 голосов
/ 30 мая 2019

Я новичок в SQL Server, раньше работал с MYSQL и пытался получить записи из таблицы с помощью Group By.

Структура таблицы приведена ниже:

SELECT S1.ID,S1.Template_ID,S1.Assigned_By,S1.Assignees,S1.Active FROM "Schedule" AS S1;

Выход:

ID Template_ID  Assigned_By Assignees Active
2   25          1           3         1
3   25          5           6         1
6   26          5           6         1

Мне нужно получить значения всех столбцов, используя оператор Group By ниже

SELECT Template_ID FROM "Schedule" WHERE "Assignees" IN(6, 3) GROUP BY "Template_ID";

Выход:

Template_ID

25
26

Я пробовал следующий код для извлечения таблицы с помощью Group By, но он выбирает все строки.

SELECT S1.ID,S1.Template_ID,S1.Assigned_By,S1.Assignees,S1.Active FROM "Schedule" AS S1 INNER JOIN(SELECT Template_ID FROM "Schedule" WHERE "Assignees" IN(6, 3) GROUP BY "Template_ID") AS S2 ON S2.Template_ID=S1.Template_ID

Мой вывод должен быть таким,

   ID Template_ID  Assigned_By Assignees Active
    2   25          1           3         1
    6   26          5           6         1

Мне было интересно, смогу ли я получить идентификатор колонки? Я использую идентификатор для редактирования записей в Интернете.

1 Ответ

3 голосов
/ 30 мая 2019

Запрос также не работает должным образом в MySQL, кроме как случайно.

Неагрегированные столбцы в MySQL не являются частью стандарта SQL и даже не разрешены в MySQL 5.7 и более поздних версиях, если не изменено значение по умолчанию для режима ONLY_FULL_GROUP_BY.

В более ранних версиях результат является недетерминированным .

Сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются недетерминированными.Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY.

Это означает, что нет способа узнать, какие строки будут возвращены этим запросом:

SELECT S1.ID,S1.Template_ID,S1.Assigned_By,S1.Assignees,S1.Active 
FROM "Schedule" AS S1
GROUP BY Template_ID;

Чтобы получить детерминированные результаты, вам нужен способ ранжирования строк с помощью функций ранжирования , представленных в MySQL 8, например ROW_NUMBER().Они уже доступны в SQL Server , по крайней мере, начиная с SQL Server 2012.Синтаксис одинаков для обеих баз данных:

WITH ranked as AS 
(
    SELECT 
        ID,Template_ID,Assigned_By,Assignees Active, 
        ROW_NUMBER(PARTITION BY Template_ID Order BY ID)
    FROM Scheduled
    WHERE Assignees IN(6, 3) 
)
SELECT ID,Template_ID,Assigned_By,Assignees Active
FROM ranked
Where RN=1

PARTITION BY Template_ID разбивает строки результатов на основе их значения Template_ID на отдельные разделы.Внутри этого раздела строки упорядочены в соответствии с предложением ORDER BY.Наконец, ROW_NUMBER вычисляет номер строки для каждой упорядоченной строки раздела.

...