Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2013.08.04;
Скачать: [xml.tar.bz2];

Вниз

Получение остатков на каждую дату   Найти похожие ветки 

 
xmen   (2010-11-24 19:44) [0]

СУБД Oracle, в БД имеется таблица, в которой одно из полей дата и время, второе сумма операции, третье входящий остаток.

Возможно ли одним запросом получить список входящих остатков на начало каждой из дат, т.е. в одном дне несколько записей имеющих разное время, соответственно остаок на начало имеет наименьшее время.

на выходе нужен список из пар: дата и время, входящий остаток.


 
Игорь Шевченко ©   (2010-11-24 20:25) [1]

Возможно, с использованием аналитических функций.


 
Игорь Шевченко ©   (2010-11-24 20:36) [2]

Или я что-то не понял или без аналитики где-то так:

WITH foo AS (
 SELECT TO_DATE("01.01.2000 01:00","dd.mm.yyyy hh24:mi") your_date, 1 rem FROM dual
 UNION ALL
 SELECT TO_DATE("01.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 2 rem FROM dual
 UNION ALL
 SELECT TO_DATE("02.01.2000 01:00","dd.mm.yyyy hh24:mi") your_date, 4 rem FROM dual
 UNION ALL
 SELECT TO_DATE("02.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 6 rem FROM dual
)
SELECT TRUNC(your_date), MIN(rem) FROM foo
 GROUP BY TRUNC(your_date);


 
Inovet ©   (2010-11-24 22:18) [3]

> [2] Игорь Шевченко ©   (24.11.10 20:36)
> SELECT TRUNC(your_date), MIN(rem) FROM foo
> GROUP BY TRUNC(your_date);

Наверно как-то так надо, потому что MIN(rem) вряд ли правильно

SELECT your_date, rem
FROM tbl t LEFT JOIN (
 SELECT MIN(your_date)
 FROM tbl
 GROUP BY TRUNC(your_date)
) tm ON t.your_date = tm.your_date
;


 
Игорь Шевченко ©   (2010-11-24 23:47) [4]


> потому что MIN(rem) вряд ли правильно


Значит через аналитику.

WITH foo AS (
SELECT TO_DATE("01.01.2000 01:00","dd.mm.yyyy hh24:mi") your_date, 2 rem FROM dual
UNION ALL
SELECT TO_DATE("01.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 1 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 00:30","dd.mm.yyyy hh24:mi") your_date, 4 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 6 rem FROM dual
)
SELECT your_date,rem FROM foo
 WHERE your_date IN (SELECT DISTINCT MIN(your_date) OVER (PARTITION BY TRUNC(your_date)) FROM foo)


Вылезает
01.01.2000 01:00, 2
02.01.2000 00:30, 4


 
Кщд   (2010-11-25 10:34) [5]

>Получение остатков на каждую дату

WITH foo AS (
SELECT TO_DATE("01.01.2000 01:00","dd.mm.yyyy hh24:mi") your_date, 2 rem FROM dual
UNION ALL
SELECT TO_DATE("01.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 1 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 00:30","dd.mm.yyyy hh24:mi") your_date, 4 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 6 rem FROM dual
)
SELECT trunc(g.your_date),
      min(g.rem ) keep (dense_rank first order by g.your_date)
FROM foo g
GROUP BY trunc(g.your_date)


 
Кщд   (2010-11-25 11:16) [6]

>Inovet ©   (24.11.10 22:18) [3]
если нужно на КАЖДУЮ строку, то двойной FTS - самый последний вариант и можно делать так, как предлагал Игорь Шевченко - через аналитику:

WITH foo AS (
SELECT TO_DATE("01.01.2000 01:00","dd.mm.yyyy hh24:mi") your_date, 2 rem FROM dual
UNION ALL
SELECT TO_DATE("01.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 1 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 00:30","dd.mm.yyyy hh24:mi") your_date, 4 rem FROM dual
UNION ALL
SELECT TO_DATE("02.01.2000 02:00","dd.mm.yyyy hh24:mi") your_date, 6 rem FROM dual
)
SELECT g.your_date, g.rem,
     first_value(g.rem) over(partition by trunc(g.your_date) order by g.your_date)    
FROM foo g
order by g.your_date


 
Inovet ©   (2010-11-25 16:09) [7]

> [6] Кщд   (25.11.10 11:16)
> если нужно на КАЖДУЮ строку, то двойной FTS - самый последний
> вариант и можно делать так, как предлагал Игорь Шевченко
> - через аналитику:

Я особенносте Оракл не знаю, поэтому и написал "как-то так".


 
xmen   (2010-11-25 17:17) [8]

Всем спасибо, попробую предложенные варианты.

После того как запостил вопрос написал свое решение, оно почему-то очень громоздкое:

Select SS.CID, SS.DayList,
(Select Abs(C_4)
From IBS.VW_CRIT_FULL_RECORDS
Where Collection_Id = SS.CID And
C_1 = TO_DATE(SS.MinTime, "DD/MM/YYYY HH24:MI:SS") And
RowNum <= 1) Ostatok
From
(Select Days.CID, Days.DayList,
(Select To_Char(Min(C_1), "DD/MM/YYYY HH24:MI:SS")
From IBS.VW_CRIT_FULL_RECORDS
Where (Collection_Id = Days.CID) And
(C_1 >= TO_DATE(Days.DayList || " 00:00:00", "DD/MM/YYYY HH24:MI:SS")) And
(C_1 <= TO_DATE(Days.DayList || " 23:59:59", "DD/MM/YYYY HH24:MI:SS"))
) MinTime
From
(Select Distinct CID, DL.DayList
From
(Select Collection_Id CID, TO_CHAR(C_1, "DD/MM/YYYY") DayList
From IBS.VW_CRIT_FULL_RECORDS
Where (Collection_Id = "4290840243") And
(C_1 >= TO_DATE("06/01/2010 00:00:00", "DD/MM/YYYY HH24:MI:SS")) And
(C_1 <= TO_DATE("24/11/2010 23:59:59", "DD/MM/YYYY HH24:MI:SS"))
) DL
) Days
) SS


в данной части на клиенте будут подставлены нужные значения
Where (Collection_Id = "4290840243") And
(C_1 >= TO_DATE("06/01/2010 00:00:00", "DD/MM/YYYY HH24:MI:SS")) And
(C_1 <= TO_DATE("24/11/2010 23:59:59", "DD/MM/YYYY HH24:MI:SS"))


 
Кщд   (2010-11-26 07:42) [9]

>xmen   (25.11.10 17:17) [8]
1. трижды обращаетесь к одной и той же таблице;
2. неаккуратно используете псевдонимы;
3. лишние преобразования date-char-date - несмотря на то, что Вам в этой ветке рассказали о trunc
4. с какой целью использован rownum?

было бы отлично, если бы привели пример исходных данных(напр., Игорь Шевченко ©   (24.11.10 20:36) [2]) и тех, что нужно получить.


 
Кщд   (2010-11-26 08:03) [10]

>Inovet ©   (25.11.10 16:09) [7]
тот вариант, что предложили Вы, не просто не вернет нужного результата(т.е. это аналог select your_date, rem from tbl:)), но даже не будет выполняться
не только на Oracle


 
xmen   (2010-11-26 10:22) [11]


> >xmen   (25.11.10 17:17) [8]1. трижды обращаетесь к одной
> и той же таблице;2. неаккуратно используете псевдонимы;3.
>  лишние преобразования date-char-date - несмотря на то,
> что Вам в этой ветке рассказали о trunc4. с какой целью
> использован rownum?было бы отлично, если бы привели пример
> исходных данных(напр., Игорь Шевченко ©   (24.11.10 20:36)
> [2]) и тех, что нужно получить.


Действительно трижды - так уж получилось :-)
неаккуратно - поясните.
что trunc используют видел, но во-первых я был не в курсе, что она делает, а во вторых написал свой "шедевр" немного раньше чем ответили на форуме.

Исходные данные такие:

Дата и время проводки Входящий остаток
08.05.2010 08:39:16 -842783,49
08.05.2010 08:39:16 -843337,66
08.05.2010 23:59:59 -843483,49
08.05.2010 23:59:59 -878531,31
08.05.2010 23:59:59 -880921,31
08.05.2010 23:59:59 -884204,83
08.05.2010 23:59:59 -885710,53
08.05.2010 23:59:59 -886010,53
08.05.2010 23:59:59 -888010,53
08.05.2010 23:59:59 -889010,53
08.05.2010 23:59:59 -890010,53
08.05.2010 23:59:59 -985010,53
08.05.2010 23:59:59 -1032020,53
08.05.2010 23:59:59 -1041030,53
08.05.2010 23:59:59 -3343644,68
08.05.2010 23:59:59 -3251024,68
08.05.2010 23:59:59 -3231224,68
08.05.2010 23:59:59 -3118431,91
08.05.2010 23:59:59 -3118481,91
08.05.2010 23:59:59 -3118531,91
08.05.2010 23:59:59 -3118536,49
08.05.2010 23:59:59 -3118561,91
08.05.2010 23:59:59 -3118611,91
08.05.2010 23:59:59 -3118677,58
08.05.2010 23:59:59 -3118727,58
08.05.2010 23:59:59 -3118777,58
08.05.2010 23:59:59 -3118927,58
08.05.2010 23:59:59 -3119077,58
08.05.2010 23:59:59 -3119227,58
08.05.2010 23:59:59 -3121227,58
08.05.2010 23:59:59 -3123227,58
08.05.2010 23:59:59 -3121727,58
08.05.2010 23:59:59 -3120227,58
08.05.2010 23:59:59 -3119227,58
08.05.2010 23:59:59 -3116227,58
08.05.2010 23:59:59 -3113227,58
08.05.2010 23:59:59 -3110222,58
08.05.2010 23:59:59 -3107534,58
08.05.2010 23:59:59 -3105534,58
08.05.2010 23:59:59 -3106034,58
08.05.2010 23:59:59 -3105874,58
08.05.2010 23:59:59 -3103874,58
08.05.2010 23:59:59 -3096874,58
08.05.2010 23:59:59 -3293124,58
08.05.2010 23:59:59 -1293124,58

В итоге нужно получить 08.05.2010 -842783,49
Естественно в исходных данных дней гораздо больше.

Изначально, в качестве примера мне показывали другие данные, где у каждой операции было свое время, но впоследствии оказалось, что операции могут быть проведены пакетно и тогда у них будет одно время, поэтому было добавлено rownum


 
Игорь Шевченко ©   (2010-11-26 14:11) [12]

решение из [2] никак ? заменив MIN на MAX
Насколько я вижу, у тебя остаток все время уменьшается в течение одной даты.


 
Inovet ©   (2010-11-26 20:41) [13]

> [10] Кщд   (26.11.10 08:03)
> [10] Кщд   (26.11.10 08:03)
> тот вариант, что предложили Вы, не просто не вернет нужного
> результата(т.е. это аналог select your_date, rem from tbl:
> )), но даже не будет выполняться не только на Oracle

Да. Вот так должен работать

SELECT t.your_date, t.rem
FROM tbl t JOIN (
SELECT MIN(your_date) as your_date
FROM tbl
GROUP BY TRUNC(your_date)
) tm ON t.your_date = tm.your_date


Судя по данным в
> [11] xmen   (26.11.10 10:22)

условие
> [0] xmen   (24.11.10 19:44)
> соответственно остаок на начало имеет наименьшее время

невыполнимо, нет уникального признака, какая проводка была первой. Где здесь наименьшее время?

> 08.05.2010 08:39:16 -842783,49
> 08.05.2010 08:39:16 -843337,66


 
Кщд   (2010-11-29 08:46) [14]

>xmen   (26.11.10 10:22) [11]
>неаккуратно - поясните.
нет псевдонимов у таблиц и полей - это чревато непредсказуемым результатом запроса

по поводу rownum: т.е. Вам всё равно какой из двух остатков с одним и тем же временем брать?)
пора бы задуматься об уникальном идентификаторе записи или - как минимум - сменить тип поля на timestamp

>Дата и время проводки Входящий остаток
>08.05.2010 08:39:16 -842783,49

с такими данными неудобно работать
>было бы отлично, если бы привели пример исходных данных(напр., >Игорь Шевченко ©   (24.11.10 20:36) [2]) и тех, что нужно получить.


 
Кщд   (2010-11-29 08:51) [15]

>Inovet ©   (26.11.10 20:41) [13]

>невыполнимо, нет уникального признака, какая проводка была первой. >Где здесь наименьшее время?
абсолютно в точку)
в этом случае автор берет любой остаток - какой заблагорассудится, чтобы пользователям учетной системы было не скучно
т.е. теоретически дважды выполненный запрос вернет разные результаты на одних и тех же данных)


 
xmen   (2010-11-29 11:28) [16]


> >xmen   (26.11.10 10:22) [11]>неаккуратно - поясните.нет
> псевдонимов у таблиц и полей - это чревато непредсказуемым
> результатом запроса

что именно мне нужно ставить и где, чтобы такого не произошло?

по поводу rownum: т.е. Вам всё равно какой из двух остатков с одним и тем же временем брать?)пора бы задуматься об уникальном идентификаторе записи или - как минимум - сменить тип поля на timestamp

Мне не все равно, но другого варианта я не вижу. Скорее всего у записи есть уникальный идентификатор, но мне эта информация не доступна.
Я не разработчки данной системы, но ведь ни кто мне запрещает мне использовать свои запросы ...


> решение из [2] никак ? заменив MIN на MAXНасколько я вижу,
>  у тебя остаток все время уменьшается в течение одной даты.
>

В приведенных данных остаток действительно все время уменьшается, но в жизни могут быть и другие ситуации, в общем-то один из предложенных здесь вариантов решения меня вполне устраивает.
Так что все огромное спасибо.


> Кщд   (29.11.10 08:51) [15]
> >Inovet ©   (26.11.10 20:41) [13]>невыполнимо, нет уникального
> признака, какая проводка была первой. >Где здесь наименьшее
> время?абсолютно в точку)в этом случае автор берет любой
> остаток - какой заблагорассудится, чтобы пользователям учетной
> системы было не скучнот.е. теоретически дважды выполненный
> запрос вернет разные результаты на одних и тех же данных)


Все верно, я беру любую, но это не критично, суть в том, что такую работу нужно делать либо вручную, либо как-то ее автоматизировать, был выбран именно второй вариант, в итоге есть база на акссессе, которая через vba и ado цепляется к oracle, выполняет запрос, забирает данные, далее они другим запросом сравниваются с контрольными значениями, результаты отклонений анализируется сотрудником, берутся объяснения, наказываются люди - последняя часть стандартна :-)


 
Кщд   (2010-11-29 12:27) [17]

>xmen   (29.11.10 11:28) [16]
>что именно мне нужно ставить и где, чтобы такого не произошло?
псевдонимы(alias) таблиц(обязательно) и полей(желательно).

>Мне не все равно, но другого варианта я не вижу.
Вы понимаете, что дважды выполнив Ваш запрос за 08.05.2010, Вы можете получить РАЗНЫЕ суммы остатка?

>Все верно, я беру любую, но это не критично
если для Вас это некритично, то можно просто воспользоваться ф-цией random для получения остатка на дату)


 
xmen   (2010-11-29 12:43) [18]


> >xmen   (29.11.10 11:28) [16]>что именно мне нужно ставить
> и где, чтобы такого не произошло?псевдонимы(alias) таблиц(обязательно)
> и полей(желательно).

ммм, пример можно?


> >Мне не все равно, но другого варианта я не вижу. Вы понимаете,
>  что дважды выполнив Ваш запрос за 08.05.2010, Вы можете
> получить РАЗНЫЕ суммы остатка?

вы понимаешь, что если у вас в кармане 10 000, а машина стоит 1 000 000, то будь у вас хоть 9 000, хоть 11 000, вы все равно не сможете ее купить.
Там ситуация такова, что если нужное мне превышение будет, то оно будет на сотни тысяч и это все равно вылезет.
Это как превышение скорости до 10 км/ч не является нарушением :-)
Если вы знаете другой вариант решения, то выкладывайте, буду рад услышать, применить.


> >Мне не все равно, но другого варианта я не вижу. Вы понимаете,
>  что дважды выполнив Ваш запрос за 08.05.2010, Вы можете
> получить РАЗНЫЕ суммы остатка?

Понимаю, поэтому буду выполнять 1 раз :-)
Не кретично, ни кто не разобравшись шашкой махать не будет, так что любой из сотрудников всегда сможет доказать свою правоту.


> >Все верно, я беру любую, но это не критичноесли для Вас
> это некритично, то можно просто воспользоваться ф-цией random
> для получения остатка на дату)

я подумаю :-)


 
Кщд   (2010-11-29 14:37) [19]

>xmen   (29.11.10 12:43) [18]
>ммм, пример можно?
google: sql table alias

>Если вы знаете другой вариант решения, то выкладывайте, буду рад >услышать, применить.

>Кщд   (29.11.10 08:46) [14]
>пора бы задуматься об уникальном идентификаторе записи или - как >минимум - сменить тип поля на timestamp
в конце концов, если добавить/сменить тип поля в исходной таблице нет возможности, повесить триггер, котором писать сумму остатка с уникальным идентификатором в свою таблицу

>Понимаю, поэтому буду выполнять 1 раз
и получать случайное значение из таблицы
бессмысленная работа


 
xmen   (2010-11-29 23:14) [20]


> >Кщд   (29.11.10 08:46) [14]>пора бы задуматься об уникальном
> идентификаторе записи или - как >минимум - сменить тип поля
> на timestampв конце концов, если добавить/сменить тип поля
> в исходной таблице нет возможности, повесить триггер, котором
> писать сумму остатка с уникальным идентификатором в свою
> таблицу

я не разработчик этой системы, я не имею право вносить в нее изменения, такие изменения вообще мало кто имеет право вносить, каждое вносимое изменение производится по приказу, и принимается по протоколу приемо-сдаточных испытаний, кому нить вы думаете нужен такой головяк из-за моей локальной задачки?


> >Понимаю, поэтому буду выполнять 1 рази получать случайное
> значение из таблицыбессмысленная работа

это же шутка, я же говорю что выбрать один из остатков вполне приемлемо.


 
Inovet ©   (2010-11-30 00:06) [21]

> [18] xmen   (29.11.10 12:43)
> Понимаю, поэтому буду выполнять 1 раз :-)

Глупость, хоть и смайлик.

Уникальность записи скорее всего есть, только как она реализована и возможно ли определить временнУю последовательность этих проводок == записей.
> [11] xmen   (26.11.10 10:22)
> Дата и время проводки

А это не таймштамп, только показаный в таком виде?


 
xmen   (2010-11-30 09:23) [22]


> Глупость, хоть и смайлик.

человеку свойственно совершать глупости, более того иногда чтобы совершать глупости он пьет и курит :-)


> А это не таймштамп, только показаный в таком виде?

Не в курсе.
У меня есть клиентский модуль, я также знаю, что где-то далеко (в Ростове-на-Дону) есть сервер, где замещена база.
Для подключения к базе чере клиентский модуль есть имя пользователя и пароль.
Вся моя работа и работа моего подразделения связана с выборкой данных и их анализом, поэтому у меня есть доступ только к представлениям и отчетам.
Разработчики клиентского модуля сделали очень хорошую кнопочку позволяющую посмотреть текст sql запроса направляемого в БД, все запросы обращаются к представлениям, ни один напрямую к таблице не обращается.

Исходный запрос формирующий выборку имеет следующий вид:
SELECT /*+ FIRST_ROWS(1) */ ID, CLASS_ID,
COLLECTION_ID, C_1,
TO_CHAR(C_2) C_2, REF2,
TO_CHAR(C_3) C_3, TO_CHAR(C_4) C_4, C_5,
TO_CHAR(C_6) C_6, TO_CHAR(C_7) C_7, TO_CHAR(C_8) C_8,
TO_CHAR(C_9) C_9, C_10, REF10, C_11, REF11,
TO_CHAR(C_12) C_12, C_13, REF13
FROM IBS.VW_CRIT_FULL_RECORDS
WHERE (COLLECTION_ID = "4290840243") AND
(((C_1 >= TO_DATE("06/01/2010 00:00:00", "DD/MM/YYYY HH24:MI:SS")) AND
(C_1 <= TO_DATE("06/01/2010 23:59:59", "DD/MM/YYYY HH24:MI:SS")))) AND
(ROWNUM <= 20)
ORDER BY C_1, IBS.VW_CRIT_FULL_RECORDS.C_12


Какие там поля я не в курсе, я впринципе не очень селен в Oracle, когда я изучал запросы мы почему-то это делали на Paradox, с тех пор много воды утекло, и по жизни я занимаюсь немного другой работой.


 
Inovet ©   (2010-11-30 10:05) [23]

Какой-то ID есть, но что в нём и какое отношение к данным имеет, сурогат наверно, хоть может быть целым и последовательно возрастать, например, тогда можно и, то может быть, к нему привязаться MIN(id).

Если непонятна последовательность, то, в свете "такую работу нужно делать либо вручную, либо как-то ее автоматизировать", правильно будет выбирать не какую попало, а все записи с одинаковым наименьшим временем и смотреть глазами какие там лишние. А вот как смотреть, кстати? Тут вдруг окажется, что есть таки некий критерий выбора правильной записи.


 
xmen   (2010-11-30 12:29) [24]

Вот, сейчас обратил внимание, на поле C_12, в системе оно обозначено как "Н.п.п.", я так понимаю - это Номер по порядку, соответственно получается можно это поле использовать для определения первой операции.


Дата и время проводки Входящий остаток Н.п.п.
08.05.2010 08:39:16 -842783,49 47050351526
08.05.2010 08:39:16 -843337,66 47050351621
08.05.2010 23:59:59 -843483,49 47068293851
08.05.2010 23:59:59 -878531,31 47068299934
08.05.2010 23:59:59 -880921,31 47068300095
08.05.2010 23:59:59 -884204,83 47068300103
08.05.2010 23:59:59 -885710,53 47068308546
08.05.2010 23:59:59 -886010,53 47068308894
08.05.2010 23:59:59 -888010,53 47068308914
08.05.2010 23:59:59 -889010,53 47068308942
08.05.2010 23:59:59 -890010,53 47068318588
08.05.2010 23:59:59 -985010,53 47068318626
08.05.2010 23:59:59 -1032020,53 47068318638
08.05.2010 23:59:59 -1041030,53 47068328801
08.05.2010 23:59:59 -3343644,68 47068335313
08.05.2010 23:59:59 -3251024,68 47068335501
08.05.2010 23:59:59 -3231224,68 47068335622
08.05.2010 23:59:59 -3118431,91 47068352388
08.05.2010 23:59:59 -3118481,91 47068352394
08.05.2010 23:59:59 -3118531,91 47068460650
08.05.2010 23:59:59 -3118536,49 47068466616
08.05.2010 23:59:59 -3118561,91 47068469716
08.05.2010 23:59:59 -3118611,91 47068472608
08.05.2010 23:59:59 -3118677,58 47068472613
08.05.2010 23:59:59 -3118727,58 47068472621
08.05.2010 23:59:59 -3118777,58 47068484060
08.05.2010 23:59:59 -3118927,58 47068484069
08.05.2010 23:59:59 -3119077,58 47068484075
08.05.2010 23:59:59 -3119227,58 47068505857
08.05.2010 23:59:59 -3121227,58 47068505864
08.05.2010 23:59:59 -3123227,58 47068527671
08.05.2010 23:59:59 -3121727,58 47068527842
08.05.2010 23:59:59 -3120227,58 47068527874
08.05.2010 23:59:59 -3119227,58 47068527895
08.05.2010 23:59:59 -3116227,58 47068528082
08.05.2010 23:59:59 -3113227,58 47068539503
08.05.2010 23:59:59 -3110222,58 47068540001
08.05.2010 23:59:59 -3107534,58 47068642141
08.05.2010 23:59:59 -3105534,58 47068654292
08.05.2010 23:59:59 -3106034,58 47068654913
08.05.2010 23:59:59 -3105874,58 47068759756
08.05.2010 23:59:59 -3103874,58 47068759881
08.05.2010 23:59:59 -3096874,58 47068890379
08.05.2010 23:59:59 -3293124,58 47068892823
08.05.2010 23:59:59 -1293124,58 47069047343


 
Кщд   (2010-11-30 13:16) [25]

>xmen   (30.11.10 12:29) [24]

если это ДЕЙСТВИТЕЛЬНО порядковый номер, то
>Кщд   (25.11.10 10:34) [5]


 
xmen   (2010-11-30 13:36) [26]

Я взял


> Кщд   (25.11.10 11:16) [6]


вроде бы работает правильно


 
Кщд   (2010-11-30 13:54) [27]

>xmen   (30.11.10 13:36) [26]
т.е. всё же на каждую строку нужен остаток...


 
Дмитрий С ©   (2010-12-07 07:18) [28]

А что нить вроде такого можно:

SELECT
SUBSTRING(  MIN(CONCAT(`datetime`, `rem`))   FROM 19)
FROM `table`
GROUP BY TO_DAYS(`datetime`)

Прошу прощения за синтаксис mysql, других не знаю.


 
Кщд   (2010-12-07 07:23) [29]

>Дмитрий С ©   (07.12.10 07:18) [28]
простите, но это ахинея
1. этот запрос не имеет отношения к Oracle;
2. работа с датой как со строкой чревата известным удивлением в случае со сменой локали;
3. минимальный остаток на дату - не то, что нужно автору. ему нужен ПЕРВЫЙ - что явствует из ветки обсуждения;
4. первый остаток на дату необходимо выводить для КАЖДОЙ записи.


 
Дмитрий С ©   (2010-12-07 09:21) [30]


> 3. минимальный остаток на дату - не то, что нужно автору.
>  ему нужен ПЕРВЫЙ - что явствует из ветки обсуждения;

Мой запрос это и выводит.


> 1. этот запрос не имеет отношения к Oracle;
> 2. работа с датой как со строкой чревата известным удивлением
> в случае со сменой локали;

Про mysql предупредил. Там с локалью проблем не будет. К тому же их можно заменить полем id, если оно одновременно возрастает с датой.


> 4. первый остаток на дату необходимо выводить для КАЖДОЙ
> записи.

Уж это доделать не так сложно, я просто известный принцип выразил.


 
Кщд   (2010-12-07 09:49) [31]

>Дмитрий С ©   (07.12.10 09:21) [30]
>Мой запрос это и выводит.
разницу между минимальным на дату и первым во времени на дату представляете?

>К тому же их можно заменить полем id, если оно одновременно возрастает с датой.
никогда нельзя закладываться на порядок следования id(если мы про PK)
ID - это уникальный идентификатор, необходимый для поддержания ссылочной целостности
он нужен только(!) для этого

>Про mysql предупредил.
а смысл, если речь про Oracle и всеми участниками ветки даны исчерпывающие ответы, притом для Oracle?

>Там с локалью проблем не будет.
ничем не отличается от других СУБД
google: mysql locale date
подобная небрежность в обращении с локалезависимыми сущностями выходит "боком"
всегда

>Уж это доделать не так сложно, я просто известный принцип выразил.
здесь нечего доделывать
Ваш запрос не соответствует условиям автора и не вернет нужного результата ни в MySQL, ни - тем более - в Oracle


 
Дмитрий С ©   (2010-12-07 10:25) [32]


> разницу между минимальным на дату и первым во времени на
> дату представляете?

А вы? Проанализируйте еще раз запрос.


> никогда нельзя закладываться на порядок следования id(если
> мы про PK)
> ID - это уникальный идентификатор, необходимый для поддержания
> ссылочной целостности
> он нужен только(!) для этого

Я же уточнил "если оно одновременно возрастает с датой". Почему этим нельзя пользоваться? Кто решает что можно или нельзя?


> а смысл, если речь про Oracle и всеми участниками ветки
> даны исчерпывающие ответы, притом для Oracle?

Места на форуме что-ли жалко? Ответы даны, я рад, почему бы не внести разнообразия. Форум ведь и в поиске находят, мало ли полезно кому будет.


> ничем не отличается от других СУБД
> google: mysql locale date
> подобная небрежность в обращении с локалезависимыми сущностями
> выходит "боком"
> всегда

В MySQL даты (время), когда используются в строковом контексте, приводятся к виду гггг-мм-дд чч:мм:сс. Что и позволяет сортировать по ним.


> Ваш запрос не соответствует условиям автора и не вернет
> нужного результата ни в MySQL, ни - тем более - в Oracle

Ну это вам так кажется..., что вы умнее всех.
Прошу прощения за переход на личности.


 
Кщд   (2010-12-07 11:35) [33]

>Дмитрий С ©   (07.12.10 10:25) [32]
>А вы? Проанализируйте еще раз запрос.
согласен, поторопился

>Я же уточнил "если оно одновременно возрастает с датой". Почему этим нельзя пользоваться? Кто решает что можно или нельзя?
перед тем, как работать с базой, рекомендую как минимум К. Дж. Дейт "Введение в системы баз данных". Объяснять азы - занятие кропотливое и ответственное. Чувства ответственности перед Вами не питаю.
Для примера поразмышляйте о ситуации:
1. стартует транзакция А;
2. А вставляет строку - отщелкнули ID;
3. стартует транзакция Б;
4. Б вставляет строку - отщелкнули ID2 (ID2 > ID, если автоинкремент);
5. транзакция Б подтверждается(commit);
6. транзакция А подтверждается;
какую запись считать первой?
та, которая была раньше вставлена(А) или подтверждена(Б)?

кроме прочего, существует такие вещи как кэширование sequence(что актуально как раз для Oracle).

>Ответы даны, я рад, почему бы не внести разнообразия.
разнообразие - это просто отлично
но только тогда, когда качественно
Ваш код не отвечает условиям автора и неэффективен для решения его задачи
если покажете решение, на основе Вашего запроса, которое выдает результат за один проход по таблице - принесу извинения и покаюсь

>Ну это вам так кажется..., что вы умнее всех.
покажите вывод консоли MySQL по Вашему запросу на данных автора
запрос прост. то, что он выдает чепуху, очевидно
из этого не следует, что я умнее всех - лишь то, что Вы некомпетентны в данном вопросе


 
Дмитрий С ©   (2010-12-07 19:11) [34]

Лан. прекращаем.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2013.08.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.004 c
15-1362659035
alexdn
2013-03-07 16:23
2013.08.04
Погиб Андрей Панин


15-1362735718
Empleado
2013-03-08 13:41
2013.08.04
Интернет и мы


15-1362670231
Dimka Maslov
2013-03-07 19:30
2013.08.04
Локализация Венды


15-1363033805
Юрий
2013-03-12 00:30
2013.08.04
С днем рождения ! 12 марта 2013 вторник


15-1362842047
картман
2013-03-09 19:14
2013.08.04
неполное вычисление булевых выражений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский