Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти дубли с разными датами / 22 сообщений из 22, страница 1 из 1
16.08.2002, 14:31:50
    #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
16.08.2002, 15:21:46
    #32043945
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Может такое вообще нельзя одним селектом? Курсор не хочется открывать...
(:
...
Рейтинг: 0 / 0
16.08.2002, 15:27:57
    #32043950
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
А как вы добиваетесь того, чтобы были дубли.
Судя по всему, ваша задача похожа на то, с чем я столкнулся сам. Если не в лом - поведайте нам струкатуру базы (всей не обязятельно). А то не очень понятно про "запись лишняя появилась" и "случается движение приход-расход"
...
Рейтинг: 0 / 0
16.08.2002, 15:42:18
    #32043956
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Базовая таблица:

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

При проведении документа (приход или расход) в таблицу попадает или модифицируется запись тем же числом что и документ. Пока остаток не меняется - записей нет. В силу специфики движения много операций приход на отдел - расход с отдела одинакого кол-ва товара.
Если скаже вчера на 100 отделе было 10 ед., а сегодня туда пришло 5 и ушло 5 - остаток не поменялся, а новая запись появилась.
...
Рейтинг: 0 / 0
16.08.2002, 15:55:13
    #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
16.08.2002, 16:30:12
    #32043972
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Простите, но не понял я ничего.

Удачи Вам.
...
Рейтинг: 0 / 0
16.08.2002, 16:47:10
    #32043982
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Да что ж тут понимать! (:
Если остаток относительно какой то даты не менялся - не должно быть записей пока он не изменится. А они появились в силу тех или иных причин. Удалить бы (:
...
Рейтинг: 0 / 0
16.08.2002, 17:01:05
    #32043988
Denis_Ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
genie_vats!
Ежели я не ошибаюсь, то Ваша БД не правильно спроектирована изначально. Т.к. в таблице остатков должна быть всего одна строка - начальные поступления. А состояние на текущий момент должны высчитываться посредством таблицы "приход-расход" .
А то, что Вы данные трупите, которые различаются различаются по дате лишь подтверждает мою правоту!
Получается, что Вы не берете остаток на какой-то день из таблицы остатков, а расчитываете его! Дык и не фига его хранить!!!
Удачи!
...
Рейтинг: 0 / 0
16.08.2002, 17:14:39
    #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
16.08.2002, 18:47:57
    #32044044
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Скрипт красивый, жаль только что он не учитывает то, что количество может повториться через месяц (:
...
Рейтинг: 0 / 0
16.08.2002, 19:01:52
    #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
17.08.2002, 14:15:44
    #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
17.08.2002, 14:49:17
    #32044078
MarchCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
genie_vats!

Пересмотрите свой проект и подход к данным ....
Было изменение остатка - должна быть об этом запись ... Будет 100 раз изменение остатка - будет 100 записей ....
Удалить не сложно но как вы потом будете подымать движение по (счету-товару-клиенту)
и при разбирательствах это ох как вам поможет ...
...
Рейтинг: 0 / 0
17.08.2002, 16:55:19
    #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
17.08.2002, 17:13:02
    #32044088
Tulkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
order by [date], dept, artc
действительно провтыкал (в смысле не перенес с рабочего кода)-на нем + identity собственно и строится идея удаления, а ID-1 -это опционально,для инфы,можно и не использовать.
...
Рейтинг: 0 / 0
17.08.2002, 17:53:40
    #32044091
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Я кстати тоже провтыкал (:

Код: plaintext
order by dept, artc, [Date] asc
...
Рейтинг: 0 / 0
17.08.2002, 18:48:01
    #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
17.08.2002, 20:28:16
    #32044095
Vasiliy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
Моя идея не хороша, идея Tulkinа правильная
...
Рейтинг: 0 / 0
19.08.2002, 10:27:21
    #32044177
genie_vats
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубли с разными датами
2 Vasiliy

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


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