|
|
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
В таблице остатков запись производится только при изменении кол-ва. Но часто случается движение приход-расход, остаток не изменился а запись лишняя появилась. Хочется найти такие записи и прибить. Следующий селект вроде работает, но только на маленьких таблицах. На реальной базе (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 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 14:31:50 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Может такое вообще нельзя одним селектом? Курсор не хочется открывать... (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:21:46 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
А как вы добиваетесь того, чтобы были дубли. Судя по всему, ваша задача похожа на то, с чем я столкнулся сам. Если не в лом - поведайте нам струкатуру базы (всей не обязятельно). А то не очень понятно про "запись лишняя появилась" и "случается движение приход-расход" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:27:57 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Базовая таблица: create table eAllRest ( [Date] smalldatetime, Dept int, Artc int, Qty numeric(18,3) ) При проведении документа (приход или расход) в таблицу попадает или модифицируется запись тем же числом что и документ. Пока остаток не меняется - записей нет. В силу специфики движения много операций приход на отдел - расход с отдела одинакого кол-ва товара. Если скаже вчера на 100 отделе было 10 ед., а сегодня туда пришло 5 и ушло 5 - остаток не поменялся, а новая запись появилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:42:18 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Нормальная ситуация: Код: plaintext 1. 2. не нормальная ситуация: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 15:55:13 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Простите, но не понял я ничего. Удачи Вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 16:30:12 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Да что ж тут понимать! (: Если остаток относительно какой то даты не менялся - не должно быть записей пока он не изменится. А они появились в силу тех или иных причин. Удалить бы (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 16:47:10 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
genie_vats! Ежели я не ошибаюсь, то Ваша БД не правильно спроектирована изначально. Т.к. в таблице остатков должна быть всего одна строка - начальные поступления. А состояние на текущий момент должны высчитываться посредством таблицы "приход-расход" . А то, что Вы данные трупите, которые различаются различаются по дате лишь подтверждает мою правоту! Получается, что Вы не берете остаток на какой-то день из таблицы остатков, а расчитываете его! Дык и не фига его хранить!!! Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 17:01:05 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Вам это нужно что-ли ? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 17:14:39 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Скрипт красивый, жаль только что он не учитывает то, что количество может повториться через месяц (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 18:47:57 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Нашел логическую ошибку. Остановился на следующем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 19:01:52 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Лови скрипт,который удалит повторения. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 14:15:44 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
genie_vats! Пересмотрите свой проект и подход к данным .... Было изменение остатка - должна быть об этом запись ... Будет 100 раз изменение остатка - будет 100 записей .... Удалить не сложно но как вы потом будете подымать движение по (счету-товару-клиенту) и при разбирательствах это ох как вам поможет ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 14:49:17 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо 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. MarchCat Пересмотрите свой проект и подход к данным .... Было изменение остатка - должна быть об этом запись ... Будет 100 раз изменение остатка - будет 100 записей .... Удалить не сложно но как вы потом будете подымать движение по (счету-товару-клиенту) и при разбирательствах это ох как вам поможет ... На самом деле таблица остатков у нас только для скорости. Поэтому, кстати, там нет никакой информации о партионных остатках. Вся информация о движении товара - вычисляема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 16:55:19 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
order by [date], dept, artc действительно провтыкал (в смысле не перенес с рабочего кода)-на нем + identity собственно и строится идея удаления, а ID-1 -это опционально,для инфы,можно и не использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 17:13:02 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Я кстати тоже провтыкал (: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 17:53:40 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Уважаемый 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 18:48:01 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Моя идея не хороша, идея Tulkinа правильная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2002, 20:28:16 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
2 Vasiliy Согласен. (: Уже и внедрил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2002, 10:27:21 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Раз таблица остатков только для скорости, и в ней не нужны записи в случае, если остаток не изменился, то может их и не создавать? То есть при формировании новых остатков добавлять записи не все, по которым были движения, а только те, где суммарное движение за период <> 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2002, 15:49:20 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Можно было бы создать таблицу остатков одного дня, а на следующий переносить ее в основную, но много изменений происходит задним числом, да и все это довольно таки усложнит работу с остатками. Проще раз в неделю чистить. (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2002, 18:03:07 |
|
||
|
Найти дубли с разными датами
|
|||
|---|---|---|---|
|
#18+
Что-то я не пойму чего Вы хотите. Если нужно, чтобы не было записей о остатках, где нет изменения остатков, так "нет изменения остатков" это то же самое, что "суммарное движение за этот период = 0". Так? Если так, то и удаляйте такие записи после пересчёта остатков при "изменениях задним числом". Ведь вы же их пересчитываете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2002, 10:16:33 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1821002]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 365ms |

| 0 / 0 |
