Если вы открыты для использования vba , то вы можете использовать событие Worksheet_Change
для сохранения «Дата / Время изменено» на втором (скрытом) листе, например, так: 110]
Это позволит вам затем включить ваш «табель рабочего времени» в формулу, например так:
=IF(Sheet2!A1 < Sheet2!B1, "First was " & A1 & ", then " & B1, "First was " & B1 & ", then " & A1)
(Очевидно, это лишь грубый пример, и он не учитывает например, когда только в одну из ячеек были введены данные, или очистка дат при удалении данных)
Как другие предположили, можно использовать rownum в Oracle. Это немного хитро, хотя и необходимо вложить запрос дважды.
Например, для нумерации страниц запроса
select first_name from some_table order by first_name
необходимо вложить его как это
select first_name from
(select rownum as rn, first_name from
(select first_name from some_table order by first_name)
) where rn > 100 and rn <= 200
Причина этого состоит в том, что rownum определяется после где пункт и перед порядком пунктом. Для наблюдения, что я имею в виду можно запросить
select rownum,first_name from some_table order by first_name
и Вы могли бы добраться
4 Diane
2 Norm
3 Sam
1 Woody
Поэтому оракул оценивает где пункт (ни один в этом случае), затем присваивает rownums, затем сортирует результаты по first_name. Необходимо вложить запрос, таким образом, он использует rownum, присвоенный после того, как строки были отсортированы.
Второе вложение имеет отношение, как rownum рассматривают в где условие. В основном, если Вы запрашиваете, "где rownum> 100" затем Вы не получаете результатов. Это - вещь курицы и яйца, куда это не может возвратить строки, пока это не находит rownum> 100, но так как это не возвращает строк, это никогда не увеличивает rownum, таким образом, это никогда не рассчитывает к 100. Тьфу. Второй уровень вложения решает это. Обратите внимание, что это должно исказить rownum столбец в этой точке.
Наконец, Ваш порядок пунктом должен сделать запрос детерминированным. Например, если у Вас есть John Doe и John Smith, и Вы заказываете именем только, затем эти два могут переключить места с одного выполнения запроса к следующему.
Существуют статьи здесь http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html и здесь http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html. Теперь, когда я вижу, какой длины мое сообщение, я, вероятно, должен был просто отправить те ссылки...
К сожалению, методы для ограничения диапазона строк, возвращенных запросом, варьируются от одного DBMS до другого: Oracle использует ROWNUM (см. ответ ocdecio), но ROWNUM не будет работать в SQL Server.
Возможно, можно инкапсулировать эти различия с функцией, которая берет данный SQL-оператор и первые и последние номера строк и генерирует соответствующий paginatd SQL для целевого DBMS - т.е. что-то как:
sql = paginated ('select empno, ename from emp where job = ?', 101, 150)
который возвратился бы
'select * from (select v.*, ROWNUM rn from ('
+ theSql
+ ') v where rownum < 150) where rn >= 101'
для Oracle и чего-то еще для SQL Server.
Однако обратите внимание, что решение Oracle добавляет новый столбец RN к результатам, с которыми необходимо будет иметь дело.
Я полагаю, что у обоих есть аналитическая функция ROWNUM. Используйте это, и Вы будете идентичны.
В Oracle это здесь
ROW_NUMBER
Да, просто проверенный, что ROW_NUMBER является той же функцией в обоих.
"Поскольку... данные могут быть изменением от других сессий". Что Вы хотите произойти для этого?
Например, пользователь получает 'последние' десять строк в 10:30.
В 10:31 3 новых строки добавляются (таким образом, те десять, являющиеся представлением пользователем, больше не являются последними).
В 10:32 пользователь запрашивает затем 'следующие' десять записей.
Вы хотите, чтобы тот новый набор включал те три, которые были ударены с 09.08.10 вниз до 12.11.13? В противном случае в Oracle можно выбрать данные, как это было в 10:30
SELECT * FROM table_1 as of timestamp (timestamp '2009-01-29 10:30:00');
Вам все еще нужна row_number логика, например,
select * from
(SELECT a.*, row_number() over (order by hire_date) rn
FROM hr.employees as of timestamp (timestamp '2009-01-29 10:30:00') a)
where rn between 10 and 19
Если бы ожидаемый набор данных огромен, я рекомендовал бы составить временную таблицу, представление или снимок (осуществленное представление) для хранения результатов запроса + номер строки, полученный или использующий ROWNUM или аналитическую функцию ROW_NUMBER. После этого можно просто запросить это временное устройство хранения данных с помощью диапазонов номера строки. В основном необходимо разделить фактическую выборку данных из подкачки страниц.
Нет никакого универсального способа гарантировать подкачку страниц через различные продукты RDBMS. Oracle дает Вам rownum, как который можно использовать в где пункт:
where rownum < 1000
SQL Server дает Вам row_id () функция, которая может использоваться подобная rownum Oracle. Однако row_id () не доступен перед SQL Server 2005.