![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
linuxoid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Здравствуйте коллеги. Подскажите плиз, как можно вычислить максимальное кол-во подряд идущих единиц с учетем сортировки по дате. В данном случае их 5. В данном случае мы выбирали 5 из (3, 5, 3).
До сортировки по дате --------------------- | id | number | | 1 | 1 | | 2 | 0 | | 3 | 0 | | 4 | 0 | | 5 | 1 | | 6 | 1 | | 7 | 1 | | 8 | 1 | | 9 | 1 | | 10 | 1 | | 11 | 1 | | 12 | 0 | | 13 | 0 | | 14 | 0 | | 15 | 1 | | 16 | 1 | | 17 | 1 | --------------------- После сортировки по дате. --------------------- | id | number | | 1 | 0 | | 2 | 1 | | 3 | 1 | | 4 | 1 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 1 | | 10 | 1 | | 11 | 1 | | 12 | 0 | | 13 | 0 | | 14 | 0 | | 15 | 1 | | 16 | 1 | | 17 | 1 | --------------------- После сортировки ясно, что самая длинная непрерывная группа содержит 5 подряд идущих единиц. Как это реализовать с помощью SQL (с учетом того, что сначала нужно отсортировать по дате)? P.S. Postgres Это сообщение отредактировал(а) linuxoid - 3.8.2009, 16:56 |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Если оконные функции PG работают так же как в оракле то чтото вроде:
Это сообщение отредактировал(а) Zloxa - 3.8.2009, 19:54 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
linuxoid |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Спасибо за ответ. Я не совсем понял, что Вы написали. Может быть поясните ? К тому же я не знаком с оконными ф-иями и не знаю различия их с ораклом. Проблема в том, что у меня сотни тысяч записей и на данный момент я использую средства PHP. Работает все очень очень медленно, поэтому надеюсь как-то решить проблему исключительно средствами Postgres, если это возможно конечно...
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
что мешает Вам с ними ознакомиться и рассказать мне от чего предложенное мною решение Вас не удовлетворило, если это так. Все использованные мною конструкции и функции я нашел в документации PG, на которую предоставил ссылку. Правда я не искал описания принципов работы этих функций, полагая, что они реализованы так же, как в оракле. Тем не менее, я допускаю что что-то может работать несколько иначе, либо не работать вовсе. С этим предлагаю разобраться Вам. Однако результат Ваших изысканий мне не безынтересен. Это сообщение отредактировал(а) Zloxa - 5.8.2009, 23:06 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Azket |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.11.2006 Где: Россия, Краснодар Репутация: 1 Всего: 1 |
Допустим твоя таблица "T"
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Azket, идея красивая, браво
![]() ![]() используя твой принцип:
Добавлено @ 11:34 PS и даже на MS SQL должно работать ![]() Это сообщение отредактировал(а) Zloxa - 6.8.2009, 11:54 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Azket |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.11.2006 Где: Россия, Краснодар Репутация: 1 Всего: 1 |
в этом случае, а также в случае, если исходная таблица сортируется по другим столбцам, а следовательно поле ID будет не по порядку, то вполне можно добавить в начале поле
и работать с INC0 вместо ID. Это сообщение отредактировал(а) Azket - 6.8.2009, 12:14 |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Azket, а кто гарантирует что порядок inc0 будет совпадать с порядком id? Даже если бы будем использовать order by в select into, где нибудь документально зафиксировано что СУБД нам гарантирует порядок присвоения identity в соответствии с критерием, указанным в order by? Если нет, то использовать такой подход в продуктивном решении просто нельзя..
И еще, есть ли гарантия "бездырочности" при генерации identity? Это сообщение отредактировал(а) Zloxa - 6.8.2009, 12:33 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Azket |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.11.2006 Где: Россия, Краснодар Репутация: 1 Всего: 1 |
Zloxa,
а зачем нам, чтобы они совпадали? Нам на это абсолютно пофиг. На ID, мы вообще не обращаем внимания, мало ли как таблица будет отсортирована. Нам нужно, чтобы: 1) поле INC0 всегда шло по возростающей 2) у всех записей, у которых NUMBER=1 и, которые идут подряд, поле INC0 отличалось на 1 (и наоборот, те между которыми попались записи с NUMBER=0, отличались > чем 1) В итоге, когда появится поле INC, то DIF=INC0-INC. хм... ни разу не встречался с такой ситуацией |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Потому что порядок у нас в исходной задаче определяет ID а не суррогатный INC0, который в твоем скрипте генерится "от балды" Вообще, я не уверен что ТС правильно обозначил столбик. Скорее всего в заголовочном посте, за столбиком ID прячется порядковый номер колоночке, а порядок, в котором ТС выстраивает свой набор данных определяется упомянутой им вскользь датой. А меня ни разу не сбивал автомобиль. Это ведь не значит что переходя дорогу не следует соблюдать осторожности? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Azket |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.11.2006 Где: Россия, Краснодар Репутация: 1 Всего: 1 |
совсем нет, ибо написано то есть, какой после этого может быть порядок ID? А INC0 предлагается генерить только тогда, когда таблица готова для вычисления (отсортирована как нужно), и вот именно для этой таблицы, INC0 и будет порядком.
Неудачный пример, если следовать этой логике, то существует вероятность того, что запрос отправленный на сервер, может вернуть что угодно. |
|||
|
||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
В том то и вопрос - как ты собрался его генерировать, используя identity, чтобы его порядок соответствовал нужному, при этом был непрерывен и монотонен.
Да, такая вероятность существует. В результате ошибки. Вопрос лишь в том, чьей ошибки. И если от ошибки разработчиков СУБД ты не можешь застраховаться, то собственных ошибок избежать это твоя прямая обязанность как разработчика. Я не утверждал того, что identity может оставить дырки в последовательности, я не утверждал что порядок присвоенного identity может не соответствовать порядку order by в селекте. Я не знаком столь глубоко с MS. Моя интуиция подсказывает что это очень спорные вопросы и требуют, как минимум исследований. И я лишь спросил, опираешься ли ты на документально заявленный функционал платформы или же опираешься на свои домыслы и надеешься на авось. Ты ответил. Это сообщение отредактировал(а) Zloxa - 6.8.2009, 15:50 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |