|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
Привет! Есть в бд таблица с номерами документов. У таблицы есть поля: RecID - ид. д-та DocNumber - порядковый номер по типу документа (т.е. на каждый тип - своя нумерация от 1), проставляемый вручную при регистрации DocDate - дата регистрации д-та ... Мне надо сделать выборку за определенный день и кроме номера, внесенного вручную, получать "глобальный" номер документа в пределах года. Этот "глобальный" номер это физический порядковый номер документа в таблице, приобретаемый по мере добавления в таблицу, т.е. независимо от типа д-та. Т.е. получается это что-то типа RecID, но RecID ясен красен не подходит. В вфп есть функция Recno() - это то, что мне и надо. Только проблема в том, что мне нужны отчеты по дням, поэтому для получения глобального номера мне нужно делать запрос на весь год на все типы документов и тогда юзать Recno(), а это слишком много лишней инфы. Либо в 2 запроса - первый выборка за год только идентификаторов всех документов ради использования Recno(), затем уже полностью необходимые данные за интересующий день, затем какое-то объединение или скан с риплейсом и т.д. А можно ли как-то, используя чистый SQL, за один запрос это сделать? Вот даже не знаю функции, которая бы такое могла сделать - Count -подсчитывает кол-во, а Sum-суммирует... спасибо вфп9+мускул ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 15:51 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KO номер это физический порядковый номер документа в таблице, приобретаемый по мере добавления в таблицу, т.е. независимо от типа д-та убил ты меня дорогой, это ктож тебе такое насоветовал? сходи в профильный форум почитай историю ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:10 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KO, Ничего не понял, но если SQL-сервак - Oracle или MS SQL то может поможет аналитика, такая как row_number, rank, dense_rank. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:18 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
ну-ка еще раз: чем тебя примарикей записи в таблице заголовков(идентификаторов) документов не устроил (т.е. уникальный ключь, сгенерированный сервером)? почему ты считаешь, что у записей должен быть какой-то их номер (физич.номер следования)? почему отсутствие физич.номера следования на что-то влияет? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:19 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
AmKadCTAC-KO, Ничего не понял, но если SQL-сервак - Oracle или MS SQL то может поможет аналитика, такая как row_number, rank, dense_rank. у него мускуль, человек уверовался в бесплатности и необходимости именно мускуля а бесплатный сыр от билли не желает, хотя причины нежелания явно необоснованны ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:21 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
Если уж брать бесплатное, то я бы взял Oracle 10g XE. Вот ссылка как Oracle-вый row_number() сделать на MySqL. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:33 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
AmKadЕсли уж брать бесплатное, то я бы взял Oracle 10g XE. Вот ссылка как Oracle-вый row_number() сделать на MySqL. а я-бы взял express от билла, и не знал хлопот. родной сервер для родного клиента ближе. но вопрос не в этом. у вопрошавшего проблема в применении устоявшегося способа определять номер записи и производить какую-то привязку к такому номеру в родных таблицах и переносу такого-же приема(способа) к некоторым объектам БД сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:39 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
AmKadЕсли уж брать бесплатное, то я бы взял Oracle 10g XE. Вот ссылка как Oracle-вый row_number() сделать на MySqL. можно для тупого, Вы о каком физическом номере записей для сервера ведете речь? Вы ведете речь о номере в выборке? или все-же хранимом(получаемом) всегда явном физическом номере????? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:42 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
прошелмимоAmKadЕсли уж брать бесплатное, то я бы взял Oracle 10g XE. Вот ссылка как Oracle-вый row_number() сделать на MySqL. можно для тупого, Вы о каком физическом номере записей для сервера ведете речь? Вы ведете речь о номере в выборке? или все-же хранимом(получаемом) всегда явном физическом номере????? Точно не знаю, это ли нужно автору, но что я имел в виду продемонстрирую на примере. id - первичный ключ (суррогат) tip - тип документа dt - дата проведения (регистрации) id tip dt1 1 22.03.2010 17:51:432 1 17.03.2010 17:51:433 1 31.03.2010 17:51:434 4 22.03.2010 17:51:435 4 12.03.2010 17:51:436 4 17.03.2010 17:51:437 5 05.02.2010 17:51:438 5 22.03.2010 17:51:43 Запрос Код: plaintext 1. 2. 3. 4.
id tip dt rn_by_type rn_global2 1 17.03.2010 17:52:42 1 41 1 22.03.2010 17:52:42 2 63 1 31.03.2010 17:52:42 3 85 4 12.03.2010 17:52:42 1 26 4 17.03.2010 17:52:42 2 34 4 22.03.2010 17:52:42 3 77 5 05.02.2010 17:52:42 1 18 5 22.03.2010 17:52:42 2 5 где rn_by_type порядковый номер документа при сотрировке по дате в пределах типа rn_global - глобальный порядковый номер документа при сотрировке по датам по всем типам документов ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 17:57 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
AmKad, P.S. SQL-синтаксис - ораколовый. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 18:02 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
> Автор: прошелмимо > Вы ведете речь о номере в выборке? или все-же > хранимом(получаемом) всегда > явном физическом номере????? Насколько я понял автора, ему нужна "бездырочная нумерация документов", но он считает, что сервер БД сам знает когда и что ему нумеровать Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 18:37 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KO В вфп есть функция Recno() - это то, что мне и надо. Только проблема в том, что мне нужны отчеты по дням, поэтому для получения глобального номера мне нужно делать запрос на весь год на все типы документов и тогда юзать Recno(), а это слишком много лишней инфы. Либо в 2 запроса - первый выборка за год только идентификаторов всех документов ради использования Recno(), затем уже полностью необходимые данные за интересующий день, затем какое-то объединение или скан с риплейсом и т.д. Мне кажется если достаточно хорошо знать возможности используемой СУБД - в данном случае MySql, то всех этих трудоемких танцев с бубнами можно избежать. Такое мнение у меня сложилось в рез-те более усердного изучения СУБД Oracle после определенного опыта работы в связке FoxPro + Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 20:11 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
итого имеем: у сервера нет такого понятие как номер записи row_number() не имеет никакого отношения к номеру записи в таблице. это нумер-я записей в какой-то упорядоченном отборе, но никак ни физич.номер записи подобныц фоксовому. у автора проблема с архитектурой. при построении хранилища на сервере не учитывают никакого физич.следования в том смысле-контексте о котором ведет речь автор топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 20:14 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
Речь идет о входящих документах. В зависимости от типа входящего документа ему чел (или писюк) присваивает определенный номер. (Меня он как бы не интересует.) Например, для жалоб - одна нумерация, для предложений - другая, для заявлений - третья, и т.д. и каждый тип имеет независимую нумерацию начиная от 1. Все эти документы попадают в одну таблицу. В этой таблице каждой записи сервером присваивается RecID, естественно он присваивается в порядке попадания записей в эту таблицу. Для отчета мне нужен именно этот общий порядковый номер каждого входящего документа, но нельзя использовать RecID, т.к. мб удаленные записи, т.е. нужна как тут правильно сказали "бездырочная" нумерация. Отчеты нужны за 1 день. Допустим мне нужен отчет за позавчера, допустим их тогда было зарегано 10 шт. Допустим в таблице 2100 записей: за текущий год - 100, и 2000 - это записи за прошлый год. Мне нужна соотв. глобальная нумерация за текущий год - это от 1 до 100, а не 1 до 2100 как получается в RecID в идеале. Т.е. по текущему году я выбираю 10 записей из 100, которые хз где в пределах этой сотни, как же мне узнать какие будут глобальные порядковые номера (т.е. без какой-либо сортировки) у этих 10 записей по отношению к 100 за текущий год из общего кол-ва записей 2100 с дырявым RecID? Будут ли это с 52 по 61 или с 64 по 73? хз. А вот оно-то мне и нужно. row_number - это вроде оно. спасибо, буду разбираться и пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 20:26 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
Вообще-то, даже Recno() в FoxPro тебе не подошло бы. Ведь могут быть и записи помеченные как удаленные. Т.е. Recno() со сдвигом? Проще всего сделать следующее: 1. Делаешь выборку за нужный период, упорядочивая по RecId. Здесь исходим из предположения, что RecId записи созданной позднее будет иметь бОльшее значение. Код: plaintext 1. 2. 3. 4.
2. В этой выборке находишь минимальное значение RecId. Поскольку записи упорядочены по возрастанию RecId, то это будет самая первая запись выборки Код: plaintext 1. 2.
3. Подсчитываешь общее количество записей в исходной таблице со значением RecId меньше, чем найденное минимальное значение Код: plaintext 1. 2.
4. Теперь остается только в первоначальной выборке обновить содержимое поля RecId значением recno() со сдвигом на найденное количесво записей Код: plaintext 1.
Получили "физическую" нумерацию "с начала времен". Хотя, разумеется, это все ерунда. Ведь старые записи могут быть удалены. Снова пересчитывать "порядковый номер"? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 20:44 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
нет, старые записи не удаляются. это как журнал входящей корреспонденции - раз уже внесли то не удаляем. но мб исключения, например, пока регали жалобу и уже зарегали - тело передумало ее подавать и отзывает. мб просто ошибочно введенный дубликат и др. Удаленные записи могут иметь место, но их не будет много, они больше как исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 21:10 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
то что можно это сделать в несколько проходов - это понятно с самого начала. может ли это быть получено одною SQL-командой, вот в чем вопрос! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2010, 21:11 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KO, а всё-таки что не позволяет сделать это несколькими командами? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 05:11 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KO Все эти документы попадают в одну таблицу. В этой таблице каждой записи сервером присваивается RecID, естественно он присваивается в порядке попадания записей в эту таблицу. Для отчета мне нужен именно этот общий порядковый номер каждого входящего документа, но нельзя использовать RecID, т.к. мб удаленные записи, т.е. нужна как тут правильно сказали "бездырочная" нумерация. Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 09:17 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
quxix Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 09:58 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
да все нормально и за несколько подходов. думал может есть возможность за раз все сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 10:12 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
> Автор: CTAC-KO > да все нормально и за несколько подходов. думал может есть возможность за раз все сделать. За раз это делается, когда эта нумерация ведётся при повседневной работе, т.е. поступил документ и его нужно регистрировать - выдали номер и записали его в отдельное, специальное поле в таблице, удалили документ(хоть и редко, но бывает) - пересчитали номера и обновили данные в специальном поле. И тогда выборка делается действительно "за раз" простым селектом :) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 12:05 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
CTAC-KOВ вфп есть функция Recno() - это то, что мне и надо. В SQL серверах нет понятия "номер записи", так как такого понятия нет в стандарте SQL. поэтому все попытки получить запись номер X, следующую, предыдущую и т.п. приводят к извращениям в запросах. Поэтому либо извращаться, либо заводить поле с номером записи и следить за его актуальностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 12:31 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
да это все понятно. Но такая нумерация нужна больше как дополнительная фича, к тому же и не очень востребованная, а ради этого париться и закладывать обработку общего номера - нет времени и желания. Нет возможности на раз, будем делать за 2. В любом случае это непринципиально, просто интересно было. А теперь все ясно и понятно. Всем - спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 13:05 |
|
Как-то можно выбрать часть записей с их порядковыми номерами с SQL-сервака?
|
|||
---|---|---|---|
#18+
Неужели так трудно самому подумать? Все же уже было сказано. Если MySQL поддерживает подзапросы, то Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Только вот, сколько времени будет выполняться подобный запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 15:34 |
|
|
start [/forum/topic.php?fid=41&msg=36556402&tid=1585423]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
149ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 358ms |
total: | 611ms |
0 / 0 |