Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/163: Рейтинг темы: голосов - 163, средняя оценка - 4.98
14 / 14 / 1
Регистрация: 02.03.2013
Сообщений: 192

MS SQL - SELECT без повторов?

15.09.2016, 11:39. Показов 34605. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте товарищи. Запутался вконец.
Имеется у меня таблица, в которой два столбца - MyDate (DateTime) и MyString (varchar(max)).
В этой таблице 4 строки, по две строки за сутки.
2016-09-01 07:00:00 Какие то данные
2016-09-01 16:00:00 Какие то данные
2016-09-02 07:00:00 Какие то данные
2016-09-02 16:00:00 Какие то данные
Я делаю выборку - в результате получаю 4 строк (2 строки за день).
Суть вопроса - я хочу сделать выборку, в которой за каждый день только 1 строка (любая)
Пытаюсь следующим образом :
SQL
1
SELECT DISTINCT MyDate, MyString FROM dbo.rc_Tmsensor
В результате получаю свои 4 строки, так как MyDate - имеет тип DATETIME, и содержит разное время:
2016-09-01 07:00:00 Какие то данные
2016-09-01 16:00:00 Какие то данные
2016-09-02 07:00:00 Какие то данные
2016-09-02 16:00:00 Какие то данные
Тогда пытаюсь срезать время следующим образом, делая DISTINCT только по дате :
SQL
1
SELECT DISTINCT (CAST(MyDate AS DATE)), MyString FROM dbo.rc_Tmsensor
и к моему удивлению получаю вот такой результат :
2016-09-01 Какие то данные
2016-09-01 Какие то данные
2016-09-02 Какие то данные
2016-09-02 Какие то данные
То есть, время с MyDate срезалось но distinct - не удалил записи с дублирующимися MyDate.
Как же быть? Что же я делаю не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2016, 11:39
Ответы с готовыми решениями:

Рандом без повторов
Как реализовать получение нового целого числа в диапазоне от 1 до 10 при нажатии на button1 без повторов? Помогите пожалуйста.

Выделения без повторов
Как выделить из таблицы game7 avatar но без повторов.

Вставка без повторов
Привет! Таблица: id | unique | status status default 0 - для тех которые были добавлены впервые. Как лучше сделать вставку...

11
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
15.09.2016, 13:30
Цитата Сообщение от Буджака Посмотреть сообщение
Суть вопроса - я хочу сделать выборку, в которой за каждый день только 1 строка (любая)
вот тут и проблема (а уж какие-то данные - это вообще караул!!!!)
max(MyString)
group by MyDate
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
15.09.2016, 13:33
Лучший ответ Сообщение было отмечено Буджака как решение

Решение

T-SQL
1
2
3
SELECT TOP(1) WITH TIES *
FROM dbo.rc_Tmsensor
ORDER BY ROW_NUMBER()OVER(PARTITION BY CAST(MyDate AS DATE) ORDER BY 1/0);
1
14 / 14 / 1
Регистрация: 02.03.2013
Сообщений: 192
15.09.2016, 13:57  [ТС]
Цитата Сообщение от iap Посмотреть сообщение
SQL
1
2
3
SELECT TOP(1) WITH TIES *
FROM dbo.rc_Tmsensor
ORDER BY ROW_NUMBER()OVER(PARTITION BY CAST(MyDate AS DATE) ORDER BY 1/0);
Хоть я совсем не понимаю, что тут происходит, но это 100% работает :-)
Что за магия?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
15.09.2016, 14:12
никакой магии - оконные функции
1
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
15.09.2016, 14:16
Чертовщина только в 1/0
Но это Microsoft чудит! А народ использует.
Надёжнее в этом месте написать (SELECT 0), например.
Вдруг они в следующей версии решат генерировать исключение "деление на 0"?!
0
14 / 14 / 1
Регистрация: 02.03.2013
Сообщений: 192
15.09.2016, 14:17  [ТС]
В данном случае, позволю себе наглость спросить еще один момент :
В результате вышесказанного запроса, я получу результат следующего вида :
2016-09-01"25;35;47;54;37"
2016-09-02 "25;35;47;54;37"
В моем случае, данные, это строка вида :
"25;35;47;54;37"
Можно ли, попросить MS SQL раздербанить эту строку по разделителю (';'), привести к числу и вернуть мне максимальное значение ? :-)
Чтобы было :
2016-09-0154
2016-09-02 54
Понимаю, что совсем уж много хочется, но раз пошла такая пьянка :-)
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
15.09.2016, 15:08
сервер сам не умеет решать проблемы нарушения 1НФ
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
15.09.2016, 15:26
T-SQL
1
2
3
SELECT TOP(1) WITH TIES *, CAST(CAST(CAST('<item>' + REPLACE(MyString, ';', '</item><item>') + '</item>' AS xml).query('max(item)') AS nvarchar(MAX)) AS int)
FROM dbo.rc_Tmsensor
ORDER BY ROW_NUMBER()OVER(PARTITION BY CAST(MyDate AS DATE) ORDER BY 1/0);
0
14 / 14 / 1
Регистрация: 02.03.2013
Сообщений: 192
15.09.2016, 15:59  [ТС]
О, все заработало кажись!
Моя благодарность!
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
15.09.2016, 16:05
У меня работает:
T-SQL
1
2
3
4
5
6
DECLARE @test TABLE (data datetime, f nvarchar(100))
INSERT @test (data, f)
VALUES ('20160901 07:00', N'1;2;3;4;5;6'), ('20160901 16:00', N'10;20;30;40;50;60'), ('20160902 07:00', N'91;82;73;64;55;46'), ('20160902 16:00', N'110;220;330;40;50;60')
SELECT TOP(1) WITH TIES *, CAST(CAST(CAST('<item>' + REPLACE(f, ';', '</item><item>') + '</item>' AS xml).query('max(item)') AS nvarchar(max)) AS int)
FROM @test
ORDER BY ROW_NUMBER()OVER(PARTITION BY CAST(data AS DATE) ORDER BY 1/0);
1
14 / 14 / 1
Регистрация: 02.03.2013
Сообщений: 192
15.09.2016, 16:10  [ТС]
Да, у меня так же, слегка подредактировав запрос, вышло вот так :
T-SQL
1
2
3
SELECT TOP(1) WITH TIES Data, CAST(CAST(CAST('<item>' + REPLACE(Data, ';', '</item><item>') + '</item>' AS xml).query('max(item)') AS nvarchar(MAX)) AS float)
FROM dbo.rc_Tmsensor WHERE ObjectName = '10201' and EventTime > '2016-09-01'
ORDER BY ROW_NUMBER()OVER(PARTITION BY CAST(EventTime AS DATE) ORDER BY 1/0);
В жизни б не подумал, что MS SQL так умеет.
Миниатюры
MS SQL - SELECT без повторов?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2016, 16:10
Помогаю со студенческими работами здесь

Рандом без повторов
Ребят подскажите как можно срандомить с числа 100 допустим 30 чисел которые не будут повторятся.

Смена ip без повторов
Всем привет, нужна помощь. Нужно сделать что бы при смене ip на роутере через telnet ip проверялся на повтор- часто после переподключения...

Ключи из файла, без повторов
Нужно написать пхп код. Суть: При нажатие на кнопку выдаёт код из файла, но чтобы коды не повторялись.(и можно только получить 1 раз)

Выборка из коллекции без повторов
Всех приветствую! Есть массив List of String. Для примера пусть в нем 100 строк. Необходимо случайным образом выбрать 50 строк, без...

Добавление в базу без повторов
Добрый день?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru