Как выбрать уникальные значения не используя distinct?
может быть используя подзапрос, группировку строк и оконную функцию.
не уверен, что код сработает, но как-то так:
select * from ( SELECT dp.id_dep, dep.code_department, dp.code_place, vc.valuename, vr.valueseria, vr.nominal, vr.bаlrate, vr.dt_open, FROM valuerests vr JOIN valuecodes vc ON vr.id_value = vc.id_value JOIN valuekinds vk ON vc.id_valkind = vk.id_valkind JOIN place dp ON vr.id_place = dp.id_place JOIN department dep ON dp.id_dep = dep.id_department WHERE vk.code = 'AAA' AND vr.balrate > 0 AND vr.dt_open = :p_dt AND dp.code_place = :p_cp ) where ROW_NUMBER() OVER(PARTITION BY id_dep, code_department, code_place, valuename,valueseria,nominal,bаlrate, dt_open ORDER BY balrate DESC) = 1
суть в том, чтобы дать номера строкам в группировке и брать только те, где 1(то есть не повторяющиеся)
чтобы его запустить надо поэксперементировать, надеюсь идея окажется полезной 🙂
select tbl.*, ROW_NUMBER() OVER(PARTITION BY id_dep, code_department, code_place, valuename,valueseria,nominal,bаlrate, dt_open ORDER BY balrate DESC) as ic from ( SELECT dp.id_dep, dep.code_department, dp.code_place, vc.valuename, vr.valueseria, vr.nominal, vr.bаlrate, vr.dt_open, FROM valuerests vr JOIN valuecodes vc ON vr.id_value = vc.id_value JOIN valuekinds vk ON vc.id_valkind = vk.id_valkind JOIN place dp ON vr.id_place = dp.id_place JOIN department dep ON dp.id_dep = dep.id_department WHERE vk.code = 'AAA' AND vr.balrate > 0 AND vr.dt_open = :p_dt AND dp.code_place = :p_cp ) tbl where ic = 1
select * from ( select t.*, ROW_NUMBER() OVER(PARTITION BY c1,c2,c3,c4 order by c2 DESC) as Ic from ( select 'AA' as c1, 12 as c2, 33.5 as c3, 'BB' as c4 UNION ALL select 'AA' as c1, 12 as c2, 33.5 as c3, 'BB' as c4 UNION ALL select 'AA' as c1, 12 as c2, 33.5 as c3, 'BB' as c4 ) t )t2 where Ic = 1
Как в sql выбрать уникальные значения
С помощью DISTINCT можно получить только уникальные значения из столбца таблицы.
SELECT DISTINCT first_name FROM users; first_name ------------ Roman Sean Alex Michal Britney
Кроме того, DISTINCT можно использовать и с несколькими полями сразу:
SELECT DISTINCT first_name, last_name FROM users; first_name | last_name ------------+--------------- Bruce | Williss Sean | Connery Robin | Williams
Уникальные записи – SELECT DISTINCT
Примечание:
Во всех статьях текущей категории уроков по SQL используются примеры и задачи, основанные на учебной базе данных.
Приступая к изучению данного материала, рекомендуется ознакомиться с описанием учебной БД.
В подавляющем большинстве случаев, записи в таблицах баз данных уникальны, но в отдельных столбцах допускаются повторяющиеся значения. Если запрос выгружает столбцы не являющиеся ключевыми, то полученные строки могут дублироваться.
Избавиться от дубликатов можно, добавив в запрос ключевое слово DISTINCT. Оно указывается в предложении SELECT, сразу после ключевого слова SELECT:
SELECT DISTINCT FROM
Выбрать уникальные имена всех сотрудников.
-- Выполняем запрос в контексте учебной базы USE CallCenter SELECT DISTINCT Имя FROM Сотрудники
Общее количество записей в таблице сотрудников составляет 39, но приведенный SQL-код выгрузил 34 строки. 5-ть повторяющихся имен были удалены из результата.
Дополним синтаксис оператора SELECT, описанный в предыдущем уроке, новым ключевым словом:
SELECT [DISTINCT] [Имя_таблицы.]Имя_столбца[, [Имя_таблицы.]Имя_столбца2 …] FROM [[Имя_базы_данных.]Имя_Схемы.]Имя_таблицы
- Объединение таблиц – UNION
- Соединение таблиц – операция JOIN и ее виды
- Тест на знание основ SQL
Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.
Команда DISTINCT
Команда DISTINCT позволяет выбирать только уникальные значения из базы данных (то есть отсеивает дубли: к примеру, в таблице есть две Маши — тогда запрос выведет только первую).
Синтаксис
SELECT DISTINCT поле FROM имя_таблицы WHERE условие
SELECT COUNT(DISTINCT поле) FROM имя_таблицы WHERE условие
SELECT SUM(DISTINCT поле) FROM имя_таблицы WHERE условие
Таблицы для примеров
| id айди |
name имя |
age возраст |
salary зарплата |
|---|---|---|---|
| 1 | user1 | 23 | 400 |
| 2 | user2 | 25 | 500 |
| 3 | user3 | 23 | 500 |
| 4 | user4 | 30 | 900 |
| 5 | user5 | 27 | 500 |
| 6 | user6 | 28 | 900 |
Пример
Давайте выберем все уникальные значения зарплат из таблицы:
SELECT DISTINCT salary FROM employees
Результат выполнения кода:
| salary зарплата |
|---|
| 400 |
| 500 |
| 900 |
Пример
Давайте подсчитаем все уникальные значения зарплат из таблицы (их будет 3 штуки: 400 , 500 и 1000):
SELECT COUNT(DISTINCT salary) as count FROM employees
Результат выполнения кода:
| count количество |
|---|
| 3 |
Пример
Давайте подсчитаем одновременно все уникальные значения зарплат и уникальные значения возрастов и запишем их в разные поля:
SELECT COUNT(DISTINCT salary) as salary_count, COUNT(DISTINCT age) as age_count FROM employees
Результат выполнения кода:
| salary_count зарплата |
age_count возраст |
|---|---|
| 3 | 5 |
Пример
Давайте просуммируем все уникальные значения зарплат из таблицы employees :
SELECT SUM(DISTINCT salary) as sum FROM employees
Результат выполнения кода:
| sum суммарная зарплата |
|---|
| 1900 |
