powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти дубли с разными датами
22 сообщений из 22, страница 1 из 1
Найти дубли с разными датами
    #32043912
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице остатков запись производится только при изменении кол-ва. Но часто случается движение приход-расход, остаток не изменился а запись лишняя появилась. Хочется найти такие записи и прибить. Следующий селект вроде работает, но только на маленьких таблицах. На реальной базе (5 000 000 записей) не дождался. Может где-то вкралась ошибка?

create table #T
(
[Date] smalldatetime,
Dept int,
Artc int,
Qty numeric(18,3)
)

ЗЫ: Для одного товара секунд за 10 работает, для одного отдела - не дождался.

insert into #T
select min([Date]), Dept, Artc, Qty
from
eAllRest_Last
group by Dept, Artc, Qty
having count(*)>1

--create index Ind1 on #T ([Date], Dept, Artc, Qty)
--drop index #T.Ind1
create index Ind1 on #T ([Date])
create index Ind2 on #T (Dept)
create index Ind3 on #T (Artc)
create index Ind4 on #T (Qty)

select S.*, A2.*
from
#T S inner join
eAllRest_Last A1 on A1.[Date]>=S.[Date] and S.Dept=A1.Dept and S.Artc=A1.Artc and S.Qty=A1.Qty
eAllRest_Last A2 on A2.[Date]>S.[Date] and S.Dept=A2.Dept and S.Artc=A2.Artc and S.Qty=A2.Qty
where
S.[Date] between '2002.05.01' and '2002.08.16' and
S.[Dept]=93 and
-- S.Artc=633 and
A2.[Date]=(
select top 1 [Date]
from eAllRest_Last
where [Date]>S.[Date] and Dept=S.Dept and Artc=S.Artc and Qty=S.Qty
order by [Date] desc
)
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043945
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может такое вообще нельзя одним селектом? Курсор не хочется открывать...
(:
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043950
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы добиваетесь того, чтобы были дубли.
Судя по всему, ваша задача похожа на то, с чем я столкнулся сам. Если не в лом - поведайте нам струкатуру базы (всей не обязятельно). А то не очень понятно про "запись лишняя появилась" и "случается движение приход-расход"
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043956
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Базовая таблица:

create table eAllRest
(
[Date] smalldatetime,
Dept int,
Artc int,
Qty numeric(18,3)
)

При проведении документа (приход или расход) в таблицу попадает или модифицируется запись тем же числом что и документ. Пока остаток не меняется - записей нет. В силу специфики движения много операций приход на отдел - расход с отдела одинакого кол-ва товара.
Если скаже вчера на 100 отделе было 10 ед., а сегодня туда пришло 5 и ушло 5 - остаток не поменялся, а новая запись появилась.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043961
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нормальная ситуация:

Код: plaintext
1.
2.
Date                       Dept    Artc       Qty
 2002 - 05 - 16   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 25   00 : 00 : 00 	 93 	 633 	 44 . 000 


не нормальная ситуация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Date                       Dept    Artc       Qty
 2002 - 05 - 16   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 17   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 18   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 19   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 20   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 21   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 22   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 23   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 24   00 : 00 : 00 	 93 	 633 	 56 . 000 
 2002 - 05 - 25   00 : 00 : 00 	 93 	 633 	 44 . 000 
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043972
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, но не понял я ничего.

Удачи Вам.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043982
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да что ж тут понимать! (:
Если остаток относительно какой то даты не менялся - не должно быть записей пока он не изменится. А они появились в силу тех или иных причин. Удалить бы (:
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043988
Denis_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genie_vats!
Ежели я не ошибаюсь, то Ваша БД не правильно спроектирована изначально. Т.к. в таблице остатков должна быть всего одна строка - начальные поступления. А состояние на текущий момент должны высчитываться посредством таблицы "приход-расход" .
А то, что Вы данные трупите, которые различаются различаются по дате лишь подтверждает мою правоту!
Получается, что Вы не берете остаток на какой-то день из таблицы остатков, а расчитываете его! Дык и не фига его хранить!!!
Удачи!
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32043999
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам это нужно что-ли ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
set nocount on
create table #t([date] datetime, dept int, artc int, qty decimal( 10 , 2 ),)

insert #t values('2002-05-16 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-17 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-18 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-19 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-20 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-21 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-22 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-23 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-24 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-25 00:00:00',	 93 ,	 633 ,	 44 . 000 )



select distinct a.*
from #t a 
left outer join #t b on b.qty = a.qty and b.dept = a.dept and b.artc = a.artc and b.[date] < a.[date]
where b.[date] is null

select distinct a.*
from #t a 
left outer join #t b on b.qty = a.qty and b.dept = a.dept and b.artc = a.artc and b.[date] < a.[date]
where b.[date] is not null

drop table #t
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044044
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скрипт красивый, жаль только что он не учитывает то, что количество может повториться через месяц (:
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044049
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем. Нашел логическую ошибку. Остановился на следующем:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
	A1.[Date] as Date1,
	A2.[Date] as Date3,
	A1.Dept as Dept,
	A1.Artc as Artc
from 
	eAllRest_Last A1 inner join
	eAllRest_Last A2 on A2.[Date]>A1.[Date] and A2.Dept=A1.Dept and A2.Artc=A1.Artc and A1.Qty=A2.Qty
where
	A2.[Date]=
	(select top  1  dateadd(Day, - 1 ,[Date])
	from eAllRest_Last 
	where [Date]>A1.[Date] and Dept=A1.Dept and Artc=A1.Artc and Qty!=A1.Qty
		and A2.[Date]!= A1.[Date]
	order by [Date] asc
	)
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044074
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лови скрипт,который удалит повторения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
[/src]
create table #t([date] datetime, dept int, artc int, qty decimal( 10 , 2 ),)

insert #t values('15.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('16.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('18.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('19.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('20.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('21.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('22.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('23.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('24.05.2002 00:00:00',	 93 ,	 633 ,	 56 . 000 )
insert #t values('25.05.2002 00:00:00',	 93 ,	 633 ,	 44 . 000 )

  
create table #P (ID int identity ( 1 , 1 ),[date] datetime, dept int, artc int, qty decimal( 10 , 2 ))
create index P on #P (ID)
insert into #p ([date] , dept , artc , qty )select [date] , dept , artc , qty from #t


    Select ID,[date] , dept , artc , qty ,
        case when exists(select  1  from #P p2  where p2.ID=p1.ID- 1  and p1.dept=p2.dept and p1.artc=p2.artc and p1.qty=p2.qty ) 
             then ID- 1  else  0  end ID_D
    into #P1 from #P p1

    select ID,[date] , dept , artc , qty ,ID_D into #P2 from #P1 where ID_D> 0  

    delete #t from #t inner join #p2 on #t.[date]=#p2.[date] and #t.dept=#p2.dept and  #t.artc=#p2.artc and #t.qty=#p2.qty
		
select * from #t
drop table #p,#p1,#p2
[src]
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044078
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genie_vats!

Пересмотрите свой проект и подход к данным ....
Было изменение остатка - должна быть об этом запись ... Будет 100 раз изменение остатка - будет 100 записей ....
Удалить не сложно но как вы потом будете подымать движение по (счету-товару-клиенту)
и при разбирательствах это ох как вам поможет ...
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044087
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо Tulkin! Это как раз то что надо. Я немножко поправил и сейчас буду запускать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
create table #t([date] smalldatetime, dept int, artc int, qty numeric( 18 , 3 ))

set nocount on
insert #t values('2002-05-16',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-17',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-18',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-19',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-20',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-21',	 93 ,	 633 ,	 56 . 000 )
 --insert #t values('2002-05-22',	93,	633,	56.000)
 
insert #t values('2002-05-23',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-24',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-25',	 93 ,	 633 ,	 44 . 000 )
insert #t values('2002-05-22',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-26',	 93 ,	 633 ,	 22 . 000 )
insert #t values('2002-05-27',	 93 ,	 633 ,	 56 . 000 )
insert #t values('2002-05-28',	 93 ,	 633 ,	 56 . 000 )
set nocount off
  
create table #P (ID int identity ( 1 , 1 ), [date] smalldatetime, dept int, artc int, qty numeric( 18 , 3 ))
create table #P1 ([date] smalldatetime, dept int, artc int, qty numeric( 18 , 3 ), D bit)

insert into #p ([date], dept, artc, qty)
select [date], dept, artc, qty
from #t
order by [date], dept, artc  --<<<<<
 

create index P on #P (ID)

	insert into #P1
    Select [date], dept, artc, qty,
        case when exists(select  1  from #P p2  where p2.ID=p1.ID- 1  and p1.dept=p2.dept and p1.artc=p2.artc and p1.qty=p2.qty ) 
             then  1  --ID-1 
 
			 else  0  
		end as D
    from #P p1

    delete #t 
	from
		#t inner join 
		#p1 on #t.[date]=#p1.[date] and #t.dept=#p1.dept and  #t.artc=#p1.artc and #t.qty=#p1.qty and D!= 0 
		
select * from #t

drop table #p
drop table #p1
drop table #t


MarchCat
Пересмотрите свой проект и подход к данным ....
Было изменение остатка - должна быть об этом запись ... Будет 100 раз изменение остатка - будет 100 записей ....
Удалить не сложно но как вы потом будете подымать движение по (счету-товару-клиенту)
и при разбирательствах это ох как вам поможет ...

На самом деле таблица остатков у нас только для скорости. Поэтому, кстати, там нет никакой информации о партионных остатках. Вся информация о движении товара - вычисляема.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044088
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
order by [date], dept, artc
действительно провтыкал (в смысле не перенес с рабочего кода)-на нем + identity собственно и строится идея удаления, а ID-1 -это опционально,для инфы,можно и не использовать.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044091
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я кстати тоже провтыкал (:

Код: plaintext
order by dept, artc, [Date] asc
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044093
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Glory наверное не понял и предложил убить все дубли, но я так понял что это не правильно
у меня тоже есть такая таблица

Задача решается ищем минимумы и максимумы и отбрасываем повторы

go
set nocount on
create table #t([date] datetime, dept int, artc int, qty decimal(10,2),)

insert #t values('2002-05-16 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-17 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-18 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-19 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-20 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-21 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-22 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-23 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-24 00:00:00', 93, 633, 57.000)
insert #t values('2002-05-25 00:00:00', 93, 633, 44.000)
insert #t values('2002-05-26 00:00:00', 93, 633, 56.000)
insert #t values('2002-05-27 00:00:00', 93, 633, 42.000)

select distinct c.* from
(
select distinct a.*
from #t a
left outer join #t b on b.qty = a.qty and b.dept = a.dept and b.artc = a.artc and b.[date] < a.[date]
where b.[date] is null
union
select distinct a.*
from #t a
left outer join #t b on b.qty = a.qty and b.dept = a.dept and b.artc = a.artc and b.[date] > a.[date]
where b.[date] is null
) As c

drop table #t

go

Ответ

2002-05-16 00:00:00.000 93 633 56.00
2002-05-24 00:00:00.000 93 633 57.00
2002-05-25 00:00:00.000 93 633 44.00
2002-05-26 00:00:00.000 93 633 56.00
2002-05-27 00:00:00.000 93 633 42.00
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044095
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моя идея не хороша, идея Tulkinа правильная
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044177
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Vasiliy

Согласен. (:
Уже и внедрил.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044286
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз таблица остатков только для скорости, и в ней не нужны записи в случае, если остаток не изменился, то может их и не создавать?
То есть при формировании новых остатков добавлять записи не все, по которым были движения, а только те, где суммарное движение за период <> 0.
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044344
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно было бы создать таблицу остатков одного дня, а на следующий переносить ее в основную, но много изменений происходит задним числом, да и все это довольно таки усложнит работу с остатками. Проще раз в неделю чистить. (:
...
Рейтинг: 0 / 0
Найти дубли с разными датами
    #32044423
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не пойму чего Вы хотите.
Если нужно, чтобы не было записей о остатках, где нет изменения остатков, так "нет изменения остатков" это то же самое, что "суммарное движение за этот период = 0".
Так? Если так, то и удаляйте такие записи после пересчёта остатков при "изменениях задним числом". Ведь вы же их пересчитываете?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти дубли с разными датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]