Выбор первой строки для группы
18723 просмотра
3 ответа
У меня есть таблица с тремя столбцами: A,B,C
.
Значения:
+---+-----+----+
| A | B | C |
+---+-----+----+
| 1 | -10 | 5 |
| 1 | 0 | 5 |
| 1 | 10 | 5 |
| 2 | 10 | 12 |
| 2 | 0 | 12 |
| 3 | -10 | 14 |
| 4 | 0 | 8 |
| 4 | 10 | 8 |
| 5 | 0 | 6 |
| 5 | 1 | 6 |
| 5 | -5 | 6 |
+---+-----+----+
Если бы я сначала упорядочил данные по столбцу A
, а затем по столбцу B
, а затем по столбцу C
(хотя я сделал все C
значения столбцов одинаковыми для каждого A
значения столбца ), как выбрать «первую строку» для столбца A
?
Итак, это должно привести к:
+---+-----+----+
| A | B | C |
+---+-----+----+
| 1 | -10 | 5 |
| 2 | 0 | 12 |
| 3 | -10 | 14 |
| 4 | 0 | 8 |
| 5 | -5 | 6 |
+---+-----+----+
Автор: mezamorphic
Источник
Размещён: 12.11.2019 09:38
Ответы (3)
16 плюса
SELECT a, b, c
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b, c) rn
FROM mytable
) q
WHERE rn = 1
ORDER BY
a
или же
SELECT mi.*
FROM (
SELECT DISTINCT a
FROM mytable
) md
CROSS APPLY
(
SELECT TOP 1 *
FROM mytable mi
WHERE mi.a = md.a
ORDER BY
b, c
) mi
ORDER BY
a
Создайте составной индекс, (a, b, c)
чтобы запросы работали быстрее.
Какой из них более эффективен, зависит от вашего распределения данных.
Если у вас есть несколько разных значений, a
но в каждой записи много записей a
, второй запрос будет лучше.
Вы можете улучшить его еще больше, создав индексированное представление:
CREATE VIEW v_mytable_da
WITH SCHEMABINDING
AS
SELECT a, COUNT_BIG(*) cnt
FROM dbo.mytable
GROUP BY
a
GO
CREATE UNIQUE CLUSTERED INDEX
pk_vmytableda_a
ON v_mytable_da (a)
GO
SELECT mi.*
FROM v_mytable_da md
CROSS APPLY
(
SELECT TOP 1 *
FROM mytable mi
WHERE mi.a = md.a
ORDER BY
b, c
) mi
ORDER BY
a
Автор: Quassnoi
Размещён: 07.06.2012 10:55
1 плюс
Это классическая проблема и была задана ранее
Как выбрать первую строку для каждой группы в запросе SQL?
Выберите первую строку в каждой группе GROUP BY?
Хорошая поисковая фраза: «выберите первую строку в группе SQL Server»
Автор: buckley Размещён: 07.06.2012 10:570 плюса
SELECT *
FROM
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY Dealld
ORDER BY Price, Dealld) rn
FROM DealOffers) q
WHERE rn = 1
ORDER BY Name
Автор: Anil Kumar
Размещён: 20.06.2016 06:28
Вопросы из категории :
- sql Проверить наличие изменений в таблице SQL Server?
- sql Обменять уникальные индексированные значения столбцов в базе данных
- sql Как работает индексация базы данных?
- sql Как индексировать столбец базы данных
- sql Как разбить строку, чтобы я мог получить доступ к элементу x?
- sql Удалить все таблицы, имена которых начинаются с определенной строки
- sql-server Клиент SQL для Mac OS X, который работает с MS SQL Server
- sql-server SQL Server избежать подчеркивания
- sql-server Хранить файл в базе данных в отличие от файловой системы?
- sql-server-2008 Как проверить, существует ли столбец в таблице SQL Server?
- sql-server-2008 Как я могу войти и найти самые дорогие запросы?
- sql-server-2008 Обозреватель объектов в SSMS 2008 не работает, если у меня нет доступа ко всем базам данных
- sql-server-2008 Ошибка - переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM
- sql-server-2008 SQL Server 2008 Backup Compression Standard Edition
- sql-server-2008 Службы Reporting Services - имя группы в заголовке страницы