powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка (с конца одного поля на начало другого)
25 сообщений из 45, страница 1 из 2
Сортировка (с конца одного поля на начало другого)
    #32547812
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно формулировка темы получилась немного кривоватой.
Похожую проблему где-то видел на форуме, но сейчас немогу найти.

есть месяц и пары чисел (начальные и конечные показания электросчётчика)

Код: plaintext
1.
2.
3.
4.
5.
6.
 /*Должно быть вот так*/ 
янв2004  9960    9995 
фев2004  9995    50    /*Вот тут произошёл полный оборот */ 
фев2004  50      200   /*За один месяц в один день абонент может проплатить и двумя квитанциями — ему по барабану мои трудности */ 
мар2004  200     350 
апр2004  350     450 
апр2004  450     600 

Поскольку обработка квитанций после сберкассы идёт вручную, то забить в базу могут в любом порядке.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 /*Может получиться вот так*/ 
янв2004  9960    9995 
фев2004  50      200  
фев2004  9995    50   
мар2004  200     350 
апр2004  450     600 
апр2004  350     450 
Но на экране я должен показать логичную последовательность.
Никакой ORDER BY тут не катит. Объём маленький всего 40-50 записей на одного абонента за три года(один, редко два, платежа в месяц). Массово всю базу(мильёны записей) сортировать не надо. Только одного абонента, когда он затребовал распечатку своих платежей. Мне нужна любая помощь(подсказка, ссылка) в написании алгоритма — либо на сервере средствами SQL, либо на клиенте в ClientDataSet`ах.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547849
Фотография Мигалка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранить не показания счетчика (или не только), а реальные числа:
Код: plaintext
1.
2.
фев2004  9995    10050 
фев2004  10050      10200 
мар2004  10200     10350 
При забивке квитанций 50 исправлять на реальное значение автоматом
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547859
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранимая процедура (алгоритм):
выбрать первую строку в first_col, sec_col
цикл:
искать сл. sec_col
выбрать в first_col, sec_col где first_col = sec_col
конец цикла.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547861
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рабочий вариант могу дать, только значительно позже :)
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547878
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвыбрать в first_col, sec_col где first_col = sec_col
Согласен. Об этом думал. Выглядит очень даже логично, но если для каждого следующего first_col есть равный ему предыдущий sec_col. А если его нет - пропустили одну квитанцию (потеряли) при упаковке в сберкассе - распаковке у меня в операционном зале. В самом общем виде пока не дотягиваю.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547918
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не существует однозначного всеобщего решения данной задачи в рамках представленных исходных данных. Например:

Код: plaintext
1.
2.
3.
4.
5.
было  2  полных оборота за месяц
фев2004   9995      50   
фев2004      50     200  
фев2004    200    9995   
фев2004   9995      50   
фев2004      50     200  

Как различить вторую и пятую записи ? Правильно, никак !
Значит нужны дополнительные признаки...
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547924
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...или дополнительные ограничения...
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32547961
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Johnmen
Я не спорю, какие-то дополнения должны быть. Но какие? Номер квитанции, который пропечатала сберкасса? Абонент может высыпать кучку квитанций и в каком порядке их обработает кассир неизвестно. Но на два полных оборота за один месяц можно не обращать внимания. Абонент с таким бешеным потреблением энергии это эксклюзив. Его выловим другим способом и поставим более мощный счётчик (другой модели) пусть потребляет - криминала нет. Красота и марафет в этом случае не нужны. Мне важно красоту и понятность навести для основной массы абонентов(большинство пенсионеры) чтобы они меньше тратили времени и быстрее понимали распечатку сравнивая со своими корешками квитанций. Вот корешки-то они сами отсортировали так как надо - можете быть уверены на 100 баллов.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548067
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забывай еще про такую вещь, как замена счетчика. При этом нарушается последовательность показаний.
Я у себя решил этот вопрос так:
храню не месяц и год, а полную дату показания, причем два показания на одну дату не допускаются. Это позволяет делать и замены счетчиков, и смену тарифов и т.д.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548086
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vl2000
всё гениальное просто
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548090
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВАУ!!! vl2000 — родственная душа! Ты из какого Энерго?

Замену счётчика я разрулил и достаточно оптимально с точки зрения скорости БД. Интересует сортировка в пределах одного счётчика и лучше всего на клиенте.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548107
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саратовэнерго, Приволжские эл. сети
А ты?
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548117
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, не обратил внимания на профиль. Наверное из НижНовЭнерго7
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548128
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vl2000причем два показания на одну дату не допускаются
Допускаютя! И ничего с этим не сделать. Особенно когда продвинутые абоненты платят через ИнтерНет с пластиковых карт. Тот кто разрабатывал сайт для оплаты предусмотрел только дневной и ночной тарифы и НЕ предусмотрел оплату 40 кВт на человека по базовому тарифу.
Поэтому абоненты в один день делают два платежа
1. 40 кВт на человека по базовому
2. Оставшиеся кВт-ы по экономически обоснованному - ёбтть
А потом это валится мне.

>vl2000
Наверное из НижНовЭнерго7

Оно самое.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548268
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общее решение в предположении, что за рассматриваемый период (напр.месяц) счётчик не делает "полный оборот" и последовательность снятых показаний "непрерывна" (т.е. V1=100-V2=200,V1=200-V2=300,...):

1. Получаем "последнее" показание, не имеющее "продолжения" (VMax)
SELECT T1.V2 FROM T T1
WHERE NOT EXISTS (SELECT 0 FROM T T2 WHERE T1.V2=T2.V1)
2. Получаем, что хотим
SELECT CASE WHEN (V2<=VMax) THEN V2 ELSE V2-VConst, T.* FROM T
ORDER BY 1

где VConst - максимально возможное показание счетчика (напр.9999).
Ну и, естественно, добавить условие по интересующему периоду времени.
И сервер должен поддерживать CASE.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548310
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Johnmen
Если предполагать что:
счётчик не делает "полный оборот" и последовательность снятых показаний "непрерывна"
то можно обойтись простым:
SELECT d,t1,t2 order by d,t1
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548394
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильно сказал Johnmen:
нужны дополнительные признаки...
...или дополнительные ограничения..
А конкретно, дата, на которую снималось показание счетчика, а если за день снимается несколько показаний (меняются счетчики и т.п.), то еще и время.
Причем это НЕ дата, когда абонент оплачивал квитанцию, а Дата показаний.
Как же вы без этой даты определяете действующий тариф?
Например, тариф менялся 10 мая. А у вас два показания- и оба за май, одно до 9 мая, другое 31. Как узнаете, какому показанию- какой тариф?
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548444
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас и делается ;)
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548508
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vl2000

Достаточно тех ограничений, которые я указал (их и имел в виду автор, я думаю).
А что касается временного интервала, частоты снятия показаний и т.п. это абсолютно не важно и роли не играет.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548568
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну скажем, в середине месяца тарифы не меняются — по закону. Иначе население такое устроит, что министру, рискнувшему сменить тариф в середине месяца, придётся расстаться с креслом. А тариф будет отменён.
Абонент оплачивает потребление за конкретный месяц - это он указывает в квитанции. И проблема возникает, когда ...
Старый пример:
Раньше до 300 кВт был один тариф от 301 кВт другой тариф.
Хитрые абоненты, израсходовав в месяц 900 кВт, платили тремя квитанциями по 300 кВт в один день, указывая один и тот же месяц напр. май.
Все три квитанции попав в БД будут расчитаны правильно 300 и от 301 до 900.
Три раза по 300 кВт по маленькому тарифу это меньше чем 300 по маленькому и 600 по большому. Я ему насчитаю правильную задолженность, а он придёт качать права.
Проблема только в визуализации истории этих евойных платежей. Чтобы ему было проще увидеть, где я его ущучил. Если показания будут отсортированы как-то иначе (не логично и не последовательно) он начнёт скандалить, обвинять во всём компьютер и... (...баного Чубайса).
Проблема осложняется только двумя моментами
1. Произошёл оботот(переход) счётчика
2. При забивке в БД потерялась одна квитанция.
Мне по барабану эти осложнения и даже замена счётчика, расчитаю-то я всё-равно правильно. Главное показать (визуализировать).

Допущения типа в один месяц одна квитанция не проходят — это практика. Теория в данном случае никого не интересует. Должно быть так как на практике.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548572
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму я чё вы маетесь...
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT T.* FROM TableN T
ORDER BY T.Month_N,
      CASE
        WHEN (T.F2 > T.F1) THEN  1 
        ELSE - 1 
      END,
      T.F1
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548586
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Zmeishe

Я уже ответил.
Добавлю, что если потеряли одну при забивке, то в первом запросе получим 2 значения для не имеющего "продолжения". Принимаем решение о дальнейших действиях...

>Мимопроходящий
>Не пойму я чё вы маетесь...

А ты постарайся...

...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548601
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для той задачи, которую описал Zmeishe, мой запрос подходит уполне.
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548629
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подойдет. Однозначно...
:)
...
Рейтинг: 0 / 0
Сортировка (с конца одного поля на начало другого)
    #32548648
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Мимопроходящий
А если будет такой вариант (счетчик трехзначный):

янв 10 40
янв 45 90 (переход через 0)

есть гарантия, что твой запрос не сделает так:

янв 45 90 (переход через 0)
янв 10 40
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка (с конца одного поля на начало другого)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]