Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Есть запрос на выбор последних записей за N (пользователь сам задает число) дней, как обновить эти последнии записи, допустим есть еще поле STATUS и после обновления, в нем ставится метка DELETED (тобишь текст).
CREATED - дата создания записи,
MODIFY_DATE - дата последнего изменения записи,
WEIGHET_NO - номер записи, номера могут быть одинаковыми,
WEIGHET_PART - подномер,
т.е. WEIGHET_NO и WEIGHET_PART - например: (330 и 2) или (330 и 3) или (331 и 2) и т.д.
dbo.weighet.STATUS<>N'DELETED' - не выбирать со статусом DELETED



DECLARE @WEIGHET_NO int,@VIN_DAYS int
SET @WEIGHET_NO=330
SET @VIN_DAYS=13

SELECT
MAX(dbo.weighet.ID) AS ID,
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
MAX(dbo.weighet.WEIGHET_NO) AS WEIGHET_NO,
MAX(dbo.weighet.WEIGHET_PART) AS WEIGHET_PART,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=@VIN_DAYS
AND dbo.weighet.WEIGHET_NO=dbo.weighet.WEIGHET_NO
AND dbo.weighet.CREATED=dbo.weighet.CREATED
AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC
11 июн 13, 09:22    [14418569]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Пробывал что-то типо такого, но TOP(1) - т.е. выбирает только одну запись и ей присваивает статус DELETED

DECLARE @WEIGHET_NO int,@VIN_DAYS int
SET @WEIGHET_NO=330
SET @VIN_DAYS=14

WITH weighet AS
(
SELECT TOP(1) dbo.weighet.*
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=@VIN_DAYS
AND dbo.weighet.WEIGHET_NO=dbo.weighet.WEIGHET_NO
AND dbo.weighet.CREATED=dbo.weighet.CREATED
AND dbo.weighet.STATUS<>N'DELETED'
ORDER BY dbo.weighet.WEIGHET_PART DESC
)
UPDATE weighet
SET STATUS=N'DELETED',MODIFY_DATE=GETDATE()
11 июн 13, 09:27    [14418594]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
SotGE
Есть запрос на выбор последних записей за N (пользователь сам задает число) дней, как обновить эти последнии записи, допустим есть еще поле STATUS и после обновления, в нем ставится метка DELETED (тобишь текст).
CREATED - дата создания записи,
MODIFY_DATE - дата последнего изменения записи,
WEIGHET_NO - номер записи, номера могут быть одинаковыми,
WEIGHET_PART - подномер,
т.е. WEIGHET_NO и WEIGHET_PART - например: (330 и 2) или (330 и 3) или (331 и 2) и т.д.
dbo.weighet.STATUS<>N'DELETED' - не выбирать со статусом DELETED



DECLARE @WEIGHET_NO int,@VIN_DAYS int
SET @WEIGHET_NO=330
SET @VIN_DAYS=13

SELECT
MAX(dbo.weighet.ID) AS ID,
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
MAX(dbo.weighet.WEIGHET_NO) AS WEIGHET_NO,
MAX(dbo.weighet.WEIGHET_PART) AS WEIGHET_PART,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=@VIN_DAYS
AND dbo.weighet.WEIGHET_NO=dbo.weighet.WEIGHET_NO
AND dbo.weighet.CREATED=dbo.weighet.CREATED
AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

не осилил .. В чем вопрос? Можно немного поконкретнее?:)
11 июн 13, 09:29    [14418600]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Мне нужно обновить (UPDATE) последнии N записей за N дней и присвоить им в поле STATUS значение DELETED, тобишь SET STATUS=N'DELETED'
11 июн 13, 09:31    [14418604]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
SotGE
	AND dbo.weighet.CREATED=dbo.weighet.CREATED 


А вот это что ?
Т.е. вам надо обновить все записи за 2 недели с номером 330 (и доп номерами) поставив статус deleted и текущую дату в соответствующие поля?
11 июн 13, 09:31    [14418607]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
UPDATE dbo.weighet SET [STATUS]='DELETED', MODIFY_DATE=GETDATE
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=@VIN_DAYS
	  AND WEIGHET_NO=@WEIGHET_NO
	  AND [STATUS] NOT LIKE 'DELETED'

Попробуйте так может быть?
11 июн 13, 09:35    [14418617]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Сергей Викт.,

2 недели с номером 330 (и доп номерами) поставив статус deleted и текущую дату в соответствующие поля?


мне нужно обновить со всеми номерами последнии записи за N дней (допустим это 2 недели) и присвоить им статус DELETED
а вот SET @WEIGHET_NO=330 эт я для проверки делал на одной записи, не обращай внимание на эту строку :)
11 июн 13, 09:36    [14418625]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Сергей Викт.
UPDATE dbo.weighet SET [STATUS]='DELETED', MODIFY_DATE=GETDATE
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=@VIN_DAYS
	  AND WEIGHET_NO=@WEIGHET_NO
	  AND [STATUS] NOT LIKE 'DELETED'

Попробуйте так может быть?



а как последние обновить записи, допустим у меня за 1 год записей около 10000 и мне нудо за последние например 2 недели, именно последние, как?
11 июн 13, 09:38    [14418640]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
SotGE
Сергей Викт.,

2 недели с номером 330 (и доп номерами) поставив статус deleted и текущую дату в соответствующие поля?


мне нужно обновить со всеми номерами последнии записи за N дней (допустим это 2 недели) и присвоить им статус DELETED
а вот SET @WEIGHET_NO=330 эт я для проверки делал на одной записи, не обращай внимание на эту строку :)

Смотрите выше, попробуйте так, только тогда уберите условие:
AND WEIGHET_NO=@WEIGHET_NO
11 июн 13, 09:39    [14418646]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
SotGE
Мне нужно обновить (UPDATE) последнии N записей за N дней

Пусть N=3.
Т.е. нужно обновить последние 3 записи за 3 дня?
11 июн 13, 09:40    [14418659]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Jovanny
SotGE
Мне нужно обновить (UPDATE) последнии N записей за N дней

Пусть N=3.
Т.е. нужно обновить последние 3 записи за 3 дня?


не, лучше иначе написать: последнии N записей за M дней, т.е. это разные будут числа, записей может быть 10000 и нужно за последние 2 недели выбрать\обновить из этих записей и присвоить им статус DELETED
11 июн 13, 09:42    [14418669]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SotGE,

"последних записей" - имеется в виду одна последняя запись за каждый день или что?
Соберитесь и напишите на русском языке, что требуется получить.
11 июн 13, 09:44    [14418671]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
iap
SotGE,

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


допустим у меня в базе 10000 записей за 1 год накапливались, есть у этих записей номера, которые могут быть одинаковыми WEIGHET_NO, а есть подномеры WEIGHET_PART, мне нужно по этим номерам выбрать все именно последние записи за последнее изменение этих записей MODIFY_DATE, по этому времени выбрать все последние записи, а пользователь сам задает срок в днях, за какой период ему нужны записи, допустим он ввел 14 дней, и нажал кнопку очистить и ему за последние 14 дней все последние записи начиная с конца присвоились статус DELETED, и они ему больше не показываются, но всеравно остаются в базе.
11 июн 13, 09:49    [14418698]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Может так, но трудно сказать...
DECLARE @WEIGHET_NO int,@VIN_DAYS int
SET @WEIGHET_NO=330
SET @VIN_DAYS=14
 
WITH weighet AS
(
 SELECT N=ROW_NUMBER()OVER(PARTITION BY CAST(MODIFY_DATE AS DATE)ORDER WEIGHET_PART DESC DESC),* FROM dbo.weighet
 WHERE MODIFY_DATE>=DATEADD(DAY,-@VIN_DAYS,CAST(GETDATE()AS DATE))
   AND WEIGHET_NO IS NOT NULL
   AND CREATED IS NOT NULL
   AND (STATUS IS NULL OR STATUS<>N'DELETED')
)
UPDATE weighet
SET STATUS=N'DELETED',MODIFY_DATE=GETDATE()
WHERE N=1;
11 июн 13, 09:51    [14418713]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SotGE
iap
напишите на русском языке

допустим у меня в базе 10000 записей за 1 год накапливались, есть у этих записей номера, которые могут быть одинаковыми WEIGHET_NO, а есть подномеры WEIGHET_PART, мне нужно по этим номерам выбрать все именно последние записи за последнее изменение этих записей MODIFY_DATE, по этому времени выбрать все последние записи, а пользователь сам задает срок в днях, за какой период ему нужны записи, допустим он ввел 14 дней, и нажал кнопку очистить и ему за последние 14 дней все последние записи начиная с конца присвоились статус DELETED, и они ему больше не показываются, но всеравно остаются в базе.

Давно так не смеялся, пиши ещё
11 июн 13, 09:52    [14418715]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
Может так, но трудно сказать...
DECLARE @WEIGHET_NO int,@VIN_DAYS int
SET @WEIGHET_NO=330
SET @VIN_DAYS=14
 
WITH weighet AS
(
 SELECT N=ROW_NUMBER()OVER(PARTITION BY CAST(MODIFY_DATE AS DATE)ORDER WEIGHET_PART DESC DESC),* FROM dbo.weighet
 WHERE MODIFY_DATE>=DATEADD(DAY,-@VIN_DAYS,CAST(GETDATE()AS DATE))
   AND WEIGHET_NO IS NOT NULL
   AND CREATED IS NOT NULL
   AND (STATUS IS NULL OR STATUS<>N'DELETED')
)
UPDATE weighet
SET STATUS=N'DELETED',MODIFY_DATE=GETDATE()
WHERE N=1;
SotGE, это я не читал ещё Ваше последнее послание
11 июн 13, 09:53    [14418717]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SotGE,

Может, таки попробовать оформить задачу в соответствии с рекомендациями, пп.4,6?
11 июн 13, 09:53    [14418718]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
И я не понял вот эти строки:
AND dbo.weighet.WEIGHET_NO=dbo.weighet.WEIGHET_NO
 AND dbo.weighet.CREATED=dbo.weighet.CREATED
Заменил на более короткий и ясный эквивалент
11 июн 13, 09:55    [14418730]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Вообщем, я уж сам запутался, как модифицировать это

SELECT
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=13
AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

в UPDATE и присвоить всем в поле dbo.weighet.STATUS=N'DELETED'
11 июн 13, 10:11    [14418816]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
SotGE
iap
SotGE,

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


допустим у меня в базе 10000 записей за 1 год накапливались, есть у этих записей номера, которые могут быть одинаковыми WEIGHET_NO, а есть подномеры WEIGHET_PART, мне нужно по этим номерам выбрать все именно последние записи за последнее изменение этих записей MODIFY_DATE, по этому времени выбрать все последние записи, а пользователь сам задает срок в днях, за какой период ему нужны записи, допустим он ввел 14 дней, и нажал кнопку очистить и ему за последние 14 дней все последние записи начиная с конца присвоились статус DELETED, и они ему больше не показываются, но всеравно остаются в базе.

я снова "ниасилил".... Объясните, пожалуйста, нормально, по какому принципу запись помечается как DELETED.

На нормальном, русском языке. Не обижайтесь, но то, что вы описали нечитабельно и не воспринимается как нормальная речь.
11 июн 13, 10:12    [14418821]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
SotGE
Вообщем, я уж сам запутался, как модифицировать это

SELECT
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=13
AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

в UPDATE и присвоить всем в поле dbo.weighet.STATUS=N'DELETED'


UPDATE dbo.weighet SET STATUS='DELETED',MODIFY_DATE=GETDATE()
 WHERE  DATEDIFF(DAY,MODIFY_DATE,GETDATE())<=13 
		AND STATUS<>N'DELETED'
		AND MODIFY_DATE IN (SELECT MAX(MODIFY_DATE) FROM dbo.weighet GROUP BY CREATED) 

Так корректно отработает?
11 июн 13, 10:16    [14418849]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SotGE
Вообщем, я уж сам запутался, как модифицировать это

SELECT
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=13
AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

в UPDATE и присвоить всем в поле dbo.weighet.STATUS=N'DELETED'
В моём запросе поставьте в PARTITION BY дату CREATED.
А в остальном - это похоже на то, что Вам надо. А?

Совет: старайтесь никогда не накладывать ограничения на функции от полей таблицы (здесь DATEDIFF())
11 июн 13, 10:18    [14418864]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
Сергей Викт.,

Вот упростил немного,

SELECT
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
MAX(dbo.weighet.WEIGHET_NO) AS WEIGHET_NO,
MAX(dbo.weighet.WEIGHET_PART) AS WEIGHET_PART,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=13 AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

Так, у таблицы dbo.weighet, есть параметр STATUS и везде он равен NEW, STATUS=N'NEW', нужно пометить все поля за последние 14 дней и присвоить параметру STATUS=N'DELETED', но НЕЛЬЗЯ удолять те поля у которых запись создания dbo.weighet.CREATED менее 14 дней, другими словами есть запись:
11 июн 13, 10:32    [14418948]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
SotGE
Сергей Викт.,

Вот упростил немного,

SELECT
MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
MAX(dbo.weighet.WEIGHET_NO) AS WEIGHET_NO,
MAX(dbo.weighet.WEIGHET_PART) AS WEIGHET_PART,
dbo.weighet.CREATED
FROM dbo.weighet
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=13 AND dbo.weighet.STATUS<>N'DELETED'
GROUP BY CREATED ORDER BY WEIGHET_PART DESC

Так, у таблицы dbo.weighet, есть параметр STATUS и везде он равен NEW, STATUS=N'NEW', нужно пометить все поля за последние 14 дней и присвоить параметру STATUS=N'DELETED', но НЕЛЬЗЯ удолять те поля у которых запись создания dbo.weighet.CREATED менее 14 дней, другими словами есть запись:


дата создания дата изменения номер подномер
10.04.2013 26.04.2013 230 1
10.04.2013 27.04.2013 230 2
10.04.2013 28.04.2013 230 3

10.05.2013 26.05.2013 231 1
10.05.2013 27.05.2013 231 2

10.06.2013 26.06.2013 230 1
10.06.2013 27.06.2013 230 2

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

т.е. если выбрать

10.04.2013 26.04.2013 230 1
10.04.2013 27.04.2013 230 2
10.04.2013 28.04.2013 230 3

и допустим седня 29.04.2013 и я решил удолить, т.е присвоить статус DELETED за 3 дня, он выбрал две последнии

10.04.2013 27.04.2013 230 2
10.04.2013 28.04.2013 230 3

НО неможет он присвоить им данный статуст т.к. весь номер не выбран, остался еще

10.04.2013 26.04.2013 230 1

поэтому он не удоляет его, не присваевает статус DELETED, а вот если, допустим седня 29.04.2013 и я решил удолить, т.е присвоить статус DELETED за 4 дня, он выбрал три последнии

10.04.2013 26.04.2013 230 1
10.04.2013 27.04.2013 230 2
10.04.2013 28.04.2013 230 3

то он им присвоит этот статус т.к. по номеру и подномеру выбрал всю запись, подномер это что-то типо части этой записи, НО через месяц например может создасться запись с таким же номером но дата создания была бы другая
11 июн 13, 10:44    [14419026]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить последние записи за определенный срок?  [new]
SotGE
Member

Откуда:
Сообщений: 15
WEIGHET_NO - это номер
WEIGHET_PART - это подномер
11 июн 13, 10:45    [14419032]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить