Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите удалить "меньшие" строки  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
Есть таблица, состоящая из действительных чисел, например
1   2  -1
1   1  -2 <--
0   3   4
3   0   0
3   0   0 <--
2   0   0 <--
.  .  .  .  .

на строках заведен частичный порядок - одна строка меньше либо равна другой, если меньше либо равны числа стоящие на соответствующих местах, для приведенного примера будет
(1   1  -2) <=(1   2  -1)
(0   3   4)  и (3   0   0)  - несравнимы
(3   0   0) <=(3   0   0)
(2   0   0) <=(3   0   0)
и т.д.

требуется удалить строки, которые меньше либо равны какой-либо другой (в исходной таблице отмечены стрелочками), т.е. должны остаться (стрелочки указывают на места удаленных строк)
1   2  -1
           <--
0   3   4
3   0   0
          <--
          <--
.  .  .  .

Как бы это сделать запросом? (не могу сообразить)
20 сен 12, 16:52    [13197498]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А если так?
ABC
1021
1012
20 сен 12, 19:06    [13198259]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
Mnior
А если так?
ABC
1021
1012

это не сравнимые строки будут
т.к. в колонке B больше число в первой строке, а в колонке C больше число во второй строке
т.е. обе строки должны остаться
20 сен 12, 19:33    [13198361]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
наверное, я плохо частичный порядок описал
пусть даны 2 тройки чисел (a1,b1,c1) и (a2,b2,c2)
(a1,b1,c1) <= (a2,b2,c2) тогда и только тогда, когда a1<=a2, b1<=b2 и c1<=c2
порядок частичный получается, например, тройки (1, 0, 0) и (0, 1, 0) - не сравнимы

ps. может вообще в Delphi вытащить эту таблицу и разобраться
или с курсором чего-нить выдумать, есть печальный опыт:)
проблема в том, что в строке не по три числа, а по несколько сотен (определение порядка аналогично, как и для троек)
20 сен 12, 19:47    [13198401]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
aleks2
Guest
delete T
from [Есть таблица, состоящая из действительных чисел] T
where exists(select * from [Есть таблица, состоящая из действительных чисел] X
                   x.id<>T.id -- PK строки необходим, иначе задача неразрешима
                   and
                   ( x.a<=T.a and x.b<=T.b and x.c<=T.c ) 
                   and
                   (( x.a<>T.a or x.b<>T.b or x.c<>T.c ) 
                    or 
                    ( ( x.a=T.a or x.b=T.b or x.c=T.c ) and x.id<T.id )
                   )
                   
                )
20 сен 12, 19:48    [13198405]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2, ключ то можно виртуальный задать. (Row_Number)
21 сен 12, 03:10    [13199477]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
aleks2
Guest
Mnior
aleks2, ключ то можно виртуальный задать. (Row_Number)

1. Низзя быть таким умным.
2. Если не париться за DELETE, а обойтись SELECT INTO - можно и вовсе без PK.
21 сен 12, 06:03    [13199502]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
aleks2,
спасибо за код.
очевидные шероховатости поправил (вылезли при прогонах),
рабочий код выкладываю, вдруг пригодится кому-нибудь такому, как я :))
USE MoyaUchebnayaBaza

GO
IF OBJECT_ID('zzMaxStroki') IS NOT NULL
DROP TABLE zzMaxStroki -- удаляем таблицу на всякий случай

        
SET NOCOUNT ON -- подавляем вывод сообщений в окошко Messages       
CREATE TABLE  zzMaxStroki (a int, b int, c int, id  BIGINT IDENTITY(1,1)PRIMARY KEY CLUSTERED)

-- вставляем данные в таблицу
INSERT INTO zzMaxStroki VALUES(1,2,3)
INSERT INTO zzMaxStroki VALUES(1,2,3)
INSERT INTO zzMaxStroki VALUES(1,2,3)
INSERT INTO zzMaxStroki VALUES(1,2,0)
INSERT INTO zzMaxStroki VALUES(0,2,3)
INSERT INTO zzMaxStroki VALUES(0,4,3)
INSERT INTO zzMaxStroki VALUES(9,0,3)
SELECT * FROM zzMaxStroki -- выводим исходную таблицу

delete T
from zzMaxStroki T
where exists(select * from zzMaxStroki X
            where  x.id<>T.id -- PK строки необходим, иначе задача неразрешима
                   and
                   (     x.a>=T.a  -- условия, задающие порядок на строках
                     and x.b>=T.b -- условия, задающие порядок на строках
                     and x.c>=T.c -- условия, задающие порядок на строках
                   )
                   and
                   (    ( x.a<>T.a 
                       or x.b<>T.b 
                       or x.c<>T.c ) 
                     or 
                       (  ( x.a=T.a 
                         or x.b=T.b 
                         or x.c=T.c ) 
                        and 
                           x.id<T.id )
                   )                   
                )
SELECT * FROM zzMaxStroki -- выводим преобразованную таблицу (после удаления строк)              
DROP TABLE zzMaxStroki -- удаляем таблицу 
--      исходная таблица  
--      a	b	c	id
--      1	2	3	1
--      1	2	3	2
--      1	2	3	3
--      1	2	0	4
--      0	2	3	5
--      0	4	3	6
--      9	0	3	7

--      преобразованная таблица
--     (после удаления строк)
--      a	b	c	id
--      1	2	3	1
--      0	4	3	6
--      9	0	3	7 

ps. а есть тут нечто вроде хранилища простеньких запросов, используя которые можно чего-нибудь свое создавать?
21 сен 12, 18:46    [13204442]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
aleks2
Guest
pgiw99oeo
очевидные шероховатости поправил (вылезли при прогонах),
delete T
from zzMaxStroki T
where exists(select * from zzMaxStroki X
            where  x.id<>T.id -- PK строки необходим, иначе задача неразрешима
                   and
                   (     x.a>=T.a  -- условия, задающие порядок на строках
                     and x.b>=T.b -- условия, задающие порядок на строках
                     and x.c>=T.c -- условия, задающие порядок на строках
                   )
                   and
                   (    ( x.a<>T.a 
                       or x.b<>T.b 
                       or x.c<>T.c ) 
                     or 
                       (  ( x.a=T.a 
                         or x.b=T.b 
                         or x.c=T.c ) 
                        and 
                           x.id<T.id )
                   )                   
                )



Хреновый из тя поправляльщик.
delete T
from zzMaxStroki T
where exists(select * from zzMaxStroki X
            where  x.id<>T.id -- PK строки необходим, иначе задача неразрешима
                   and
                   (     x.a>=T.a  -- условия, задающие порядок на строках
                     and x.b>=T.b -- условия, задающие порядок на строках
                     and x.c>=T.c -- условия, задающие порядок на строках
                   )
                   and
                   (    ( x.a<>T.a 
                       or x.b<>T.b 
                       or x.c<>T.c ) 
                     or 
                       (  x.a=T.a AND x.b=T.b AND x.c=T.c and x.id<T.id )
                   )                   
                )
22 сен 12, 07:17    [13205785]     Ответить | Цитировать Сообщить модератору
 Re: помогите удалить "меньшие" строки  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
aleks2
Хреновый из тя поправляльщик.


да вроде работает, я попробовал, до рабочего варианта поправил, а дальше ничего не стал делать
формулу (условие) я не упрощал, сейчас подумал, что может вообще лишнее есть (закомментировал то, что может оказать лишним)
а так даже подумать времени не было
 
            where  x.id<>T.id -- PK строки необходим, иначе задача неразрешима
                   and
                   (     x.a>=T.a  -- условия, задающие порядок на строках
                     and x.b>=T.b -- условия, задающие порядок на строках
                     and x.c>=T.c -- условия, задающие порядок на строках
                   )
           --      and
           --        (    ( x.a<>T.a 
           --            or x.b<>T.b 
           --            or x.c<>T.c ) 
           --          or 
           --            (  x.a=T.a AND x.b=T.b AND x.c=T.c and x.id<T.id )
           --        )                  
                
22 сен 12, 08:42    [13205808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить