Как сравнить результат подсчета sql с предыдущим значением результата - сколько новых записей со времени моего последнего выбора подсчета - PullRequest
3 голосов
/ 10 апреля 2019

У меня есть скрипт, вставляющий новые значения в таблицу.Когда я select count(*) результаты показаны.Можно ли сравнить это значение с новым, когда я повторяю запрос?

Учитывая, что скрипт все еще вставляет новые значения, я хочу знать, сколько новых записей с момента последнего выбора счетчика.

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

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

1) Аналогично коду Гордона, но вы должны вручную сохранять значение при каждом его запуске

declare @saved_count int = 0; -- THIS MUST BE MANUALLY UPDATED EACH TIME YOU RUN IT

-- Get the different since the last run
select count(*)-@saved_count
from MyTable;

-- Get the current value => manually copy to @saved_count above
select count(*)
from MyTable;

2) Сохраните значение в более постоянном хранилище в соответствии с ответом Лукаша (вы можете использовать глобальную временную таблицу, которая будет работать после разрыва соединения, что не повлияет на производительность).

3) Вы можете выполнить автоматический запрос следующим образом, который отслеживает текущее значение и регулярно распечатывает некоторые детали для вас.

declare @CurrentCount int = 0, @LastCount int = 0;

while 1 = 1 begin
  select @CurrentCount = count(*)
  from MyTable;

  select getdate(), @CurrentCount - @LastCount;
  raiserror('Force a buffer flush',0,1) with nowait;

  set @LastCount = @CurrentCount;

  waitfor delay '00:00:10'; -- Wait 10s
end
1 голос
/ 10 апреля 2019

Вы можете материализовать это:

CREATE TABLE tab_stat(id INT IDENTITY(1,1), t DATETIME DEFAULT GETDATE(), cnt BIGINT);

INSERT INTO tab_stat(cnt)
SELECT COUNT(*)
FROM tab_name;

SELECT *, cnt - LAG(cnt,1,0) OVER(ORDER BY id) AS diff
FROM tab_stat
ORDER BY id DESC;

дБ <> демонстрация скрипки

0 голосов
/ 10 апреля 2019

В общем, вы не можете этого сделать. Однако, если в вашей таблице есть столбец идентификаторов , вы можете запомнить его и затем выполнить:

select count(*)
from t
where id > @saved_id;

Вы можете сделать что-то похожее с датой / временем создания, если это возможно.

Вам, конечно, придется присвоить максимальный идентификатор (или время создания) переменной, чтобы это сработало в следующий раз.

...