Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.8.34] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Есть набор данных
Напимер 1 01,01,2014 2 02,01,2014 1 03,01,2014 4 01,01,2014 5 01,01,2014 1 04,01,2014 2 05,01,2014 .... Надо выбрать все , но если есть 4 и 5 с той же датой то 5 исключить из выборки. |
Сообщ.
#2
,
|
|
|
В примере набора данных нет даты.
|
Сообщ.
#3
,
|
|
|
Цитата Akina @ В примере набора данных нет даты. представим что они есть. Добавлено Добавил Можно через for 1,2,3,4,5 - это константы из справочника. |
Сообщ.
#4
,
|
|
|
Инами словами, выбрать только первую запись из группы, где группировка выполняется по дате. Верно я понимаю? тогда
FAQ: Выборка первой/последней записи в группах |
Сообщ.
#5
,
|
|
|
Цитата Akina @ Инами словами, выбрать только первую запись из группы, где группировка выполняется по дате. Нет группировки. Надо выбрать все 1 2 3 4 5, за любую дату но если есть и 4 и 5 одной датой то 5 не включать. Результат будет 1 01,01,2014 2 02,01,2014 1 03,01,2014 4 01,01,2014 1 04,01,2014 2 05,01,2014 PS попробую через exists Найду 4 если есть, потом 5 если есть, если есть одна и вторая с той же датой то по id вторую исключу. |
Сообщ.
#6
,
|
|
|
Есть еще вариант, которого нет в том FAQ, по мотивам моего ответа в соседнем топике.
Можно использовать PARTITION BY. Бегло глянул, Оракл вроде норм это поддерживает. |
Сообщ.
#7
,
|
|
|
Цитата JoeUser @ Есть еще вариант, которого нет в том FAQ Неудивительно, если посмотреть на фамилию раздела, в коем тот FAQ располагается. Для Оракла - да, наиболее разумно использовать оконные функции. |
Сообщ.
#8
,
|
|
|
Скрытый текст Цитата Akina @ Неудивительно, если посмотреть на фамилию раздела, в коем тот FAQ располагается. Увы, плотной работы с SQL у меня явно маловато. А что есть - только с PostgreSQL. Посему, как у того чукчи "что вижу - то пою" |
Сообщ.
#9
,
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
надо получить Если операция nov встречается впервые не включать в набор, если это вторая то включить разницу первая-вторая, если третья то разница вторая-третья....
Можно это одним запросом? |
Сообщ.
#10
,
|
|
|
Цитата Bas @ встречается впервые Сортировка, надо понимать, по дате (поле dat)? Цитата Bas @ Можно это одним запросом? Конечно. Для начала отбросим из рассмотрения остальные операции, чтобы не мешались под ногами. Ну типа SELECT * FROM table WHERE codop NOT IN ('nov') UNION (запрос только для записей с codop = 'nov') Далее возможны несколько вариантов, применимость которых определяется конкретной СУБД. Если это, например, MS SQL или Oracle достаточно свежей версии, то следует использовать оконную аналитику и функцию LAG(). Если такой возможности нет - придётся использовать либо две копии таблицы и либо нумерующие техники, либо группировку с отбором минимальной разности дат, и считать требуемую разность. |
Сообщ.
#11
,
|
|
|
Цитата Akina @ Далее возможны несколько вариантов, применимость которых определяется конкретной СУБД. Oracle-10(11). Язык PL/plus (ЦФТ). |
Сообщ.
#12
,
|
|
|
А чё тогда вопрос в общем разделе?
http://docs.oracle.com/cd/B19306_01/server...unctions070.htm |
Сообщ.
#13
,
|
|
|
За LAG() спасибо, осталось узнать если она в ЦФТ.
Добавлено Цитата Akina @ А чё тогда вопрос в общем разделе? Хотелось посмотреть разные реализации в остальных базах. |
Сообщ.
#14
,
|
|
|
Да стандартная реализация...
select max(t1.dat), t2.dat from table t1, table t2 where t1.dat < t2.dat group by t2.dat даёт пары дат, идентифицирующие "соседние" записи. Получить по ним соотв. значения и вычесть - как два пальца. |