|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.09.2013, 17:40 | #1 |
Пользователь
Регистрация: 23.10.2009
Сообщений: 12
|
Доброго времени суток, уважаемые форумчане
Дана таблица Test CREATE TABLE Test ( ID INT IDENTITY(1,1) NOT NULL, Value INT NOT NULL ) Задача такая: определить первую запись, начиная с которой сумма итога по столбцу Value превысит 1000 Весь мозг сломала, наведите пожалуйста как реализовать запрос Решила вот таким образом, буду рада поправкам Код:
Последний раз редактировалось Stilet; 11.09.2013 в 17:19. |
10.09.2013, 19:09 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Ох и долго он будет работать для большой таблицы и больших значений оценочной константы. Если в лоб, то подправил бы так
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
10.09.2013, 19:33 | #3 |
Пользователь
Регистрация: 23.10.2009
Сообщений: 12
|
Спасибо большое!
Первый вариант уже отбросила)...теперь мне нужно как то заменить функцию TOP, чтоб запрос работал на SQL 92 Код:
А как можно оптимизировать запрос для MSSQL 2008? Последний раз редактировалось Stilet; 11.09.2013 в 17:20. |
10.09.2013, 22:39 | #4 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,799
|
На самом деле тут нужно использовать аналитическую функцию и оконное выражение, -- что-то вроде rows between preceding and unbounded following. Боюсь, что для уровня вопрошающей это слишком круто, а мне сегодня думать лень.
|
11.09.2013, 00:00 | #5 |
Пользователь
Регистрация: 23.10.2009
Сообщений: 12
|
Vapaamies, спасибо за ответ
Главное условие моего задания - "Задача решается без курсоров, на чистом SQL-92" А ваше решение больше подходит для оракл и sql 92 не поддерживает указанные функии. Вторым пунктом мне нужно написать этот же запрос для MSSQL более оптимальным способом. Последний раз редактировалось mulatoschka1990; 11.09.2013 в 00:03. |
11.09.2013, 01:35 | #6 | |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,799
|
Цитата:
Не уверен, правда, что аналитические функции входят именно в стандарт SQL-92, но поддерживаются несколькими СУБД -- это точно. И решают задачу без курсора и алгоритмики, -- это тоже не вызывает сомнений. И на практике применяются. Ваш К. О. |
|
11.09.2013, 13:35 | #7 |
Пользователь
Регистрация: 23.10.2009
Сообщений: 12
|
Vapaamies, описание предложения OVER по вашей ссылке для MSSQL 2012.
Там моя задача решалась бы так? Код:
Для SQL 92 вот такой запрос: Код:
Для mssql 2008 2 варианта: 1. Код:
Код:
Я очень буду рада критике и наставлениям)))))) |
11.09.2013, 16:51 | #8 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,799
|
И правильно, ибо использовать distinct вместе с аналитической функцией -- маразм.
Если MS SQL 2008 не поддерживает конструкцию rows between -- то самое оконное выражение, посоветовать что-то другое не могу. Я вообще не спец по MS SQL. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
нарастающий итог с учетом фактического результата | zemlyanukhina | Microsoft Office Excel | 2 | 22.02.2011 09:16 |
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) | Машуля | SQL, базы данных | 4 | 06.05.2010 21:09 |
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi | S_Yevgeniy | Помощь студентам | 1 | 27.10.2009 06:26 |
SQL запрос на основе другого SQL запрса... | Timoxa | БД в Delphi | 1 | 07.01.2007 18:15 |
нарастающий итог | SerGo | БД в Delphi | 1 | 10.11.2006 10:08 |