:: Visual Foxpro, Foxpro for DOS
Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
*!* Дано :
Use In Select("test")
Create Cursor test (id1 i, id2 i)
Insert Into test (id1, id2) Values (1, 2)
Insert Into test (id1, id2) Values (2, 3)
Insert Into test (id1, id2) Values (2, 1) && Эта пара лишняя - она повторяет первую
Insert Into test (id1, id2) Values (3, 1)
Browse Last
*!* Вопрос : Как выбрать из этой таблицы только уникальные пары ?


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Если предполагается, что порядок в паре можно менять (раз {1,2} = {2,1}), то
SELECT IIF(id1>id2, id2,id1), IIF(id1>id2, id1,id2) DISTINCT FROM test
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Use In Select("test")
Create Cursor test (id1 i, id2 i)
Insert Into test (id1, id2) Values (1, 2)
Insert Into test (id1, id2) Values (2, 3)
Insert Into test (id1, id2) Values (2, 1) &&
Insert Into test (id1, id2) Values (3, 1)
SELECT distinct ICASE(id1 < id2, CAST(TRANSFORM(id1) + ',' + TRANSFORM(id2) as c(20)), CAST(TRANSFORM(id2) + ',' + TRANSFORM(id1) as c(20)));
FROM test

Только ты мне скажи зачем тебе такая выборка? вангую: пытаешься наложить констрейн на табличку?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 13.09.17 11:09
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
of63
Если предполагается, что порядок в паре можно менять (раз {1,2} = {2,1}), то
SELECT IIF(id1>id2, id2,id1), IIF(id1>id2, id1,id2) DISTINCT FROM test

Ну или
SELECT max(id1,id2), min(id1,id2) DISTINCT FROM test
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Олег, а ты попробуй )
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
of63
Если предполагается, что порядок в паре можно менять (раз {1,2} = {2,1}), то
SELECT IIF(id1>id2, id2,id1), IIF(id1>id2, id1,id2) DISTINCT FROM test

Да порядок менять можно - спасибо !


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
PaulWist
...
Только ты мне скажи зачем тебе такая выборка? вангую: пытаешься наложить констрейн на табличку?

Паш, я и слов таких не знаю )) - дали таблицу - нужно отобрать из нее


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
of63
Олег, а ты попробуй )

Ну, чего придираться, вот так надо

SELECT max[id1,id2], min[id1,id2] DISTINCT FROM test
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Равиль
PaulWist
...
Только ты мне скажи зачем тебе такая выборка? вангую: пытаешься наложить констрейн на табличку?

Паш, я и слов таких не знаю )) - дали таблицу - нужно отобрать из нее

Опять вангую, если надо сделать такую выборку - значит в табличке не должно быть таких комбинаций, поэтому нужно ограничение уникальности на комбинацию полей (сам с такую задачу решал, думаю у тебя анлогично)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
of63
Олег, а ты попробуй )
Каюсь. Тупанул на коленке.
Благо leonid напомнил как надо.
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
leonid
of63
Олег, а ты попробуй )

Ну, чего придираться, вот так надо

SELECT max[id1,id2], min[id1,id2] DISTINCT FROM test
Шайтанама!
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
PaulWist
Равиль
PaulWist
...
Только ты мне скажи зачем тебе такая выборка? вангую: пытаешься наложить констрейн на табличку?

Паш, я и слов таких не знаю )) - дали таблицу - нужно отобрать из нее

Опять вангую, если надо сделать такую выборку - значит в табличке не должно быть таких комбинаций, поэтому нужно ограничение уникальности на комбинацию полей (сам с такую задачу решал, думаю у тебя анлогично)

Ага, вот тут ты угадал !


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Равиль
Ага, вот тут ты угадал !

Тогда давай говорить снова (с)

1. Такое ограничение нужно для таблицы в какой БД (Фокс, MSSQL, Oracle или др)?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
PaulWist
Равиль
Ага, вот тут ты угадал !

Тогда давай говорить снова (с)

1. Такое ограничение нужно для таблицы в какой БД (Фокс, MSSQL, Oracle или др)?

На фоксе - но в моем случае думаю поможет уникальный индекс типа STR(MAX(id1,id2)) + STR(MIN(id1,id2))

Предлагаю усложнить задачу - найти уникальные тройки (правда практического интереса пока нет в этом - но кто знает - вдруг пригодится) :

*!* Дано :
Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (1, 2, 3)
Insert Into test (id1, id2, id3) Values (2, 3, 4)
Insert Into test (id1, id2, id3) Values (2, 1, 3) && Эта тройка лишняя - она повторяет первую
Insert Into test (id1, id2, id3) Values (3, 1, 4)
Browse Last
*!* Вопрос : Как выбрать из этой таблицы только уникальные тройки ?


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Без UDF не асилил )
Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (1, 2, 3)
Insert Into test (id1, id2, id3) Values (2, 3, 4)
Insert Into test (id1, id2, id3) Values (2, 1, 3) && Эта тройка лишняя - она повторяет первую
Insert Into test (id1, id2, id3) Values (3, 1, 4)
SELECT mySORT(1, id1, id2, id3),;
mySORT(2, id1, id2, id3),;
mySORT(3, id1, id2, id3) DISTINCT;
FROM test
USE IN test
FUNCTION mySORT(m.parX, m.par1, m.par2, m.par3, m.par4, m.par5) && упорядочивалка значений (2..4), возвращает заданное индексом (1)
LOCAL m.p, m.i, S
m.p = PCOUNT()
DIMENSION S[m.p-1]
FOR m.i=1 TO m.p-1 && m.parX - возвращаемый параметр m.par1..3 ПОСЛЕ упорядочивания
S[m.i] = EVALUATE("m.par"+ALLTRIM(STR(m.i)))
ENDFOR
=ASORT(S) && упорядочим m.par1..3
RETURN S[m.parX] && вернем заданный параметр № 1..3
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (1, 2, 3)
Insert Into test (id1, id2, id3) Values (2, 3, 4)
Insert Into test (id1, id2, id3) Values (2, 1, 3)
Insert Into test (id1, id2, id3) Values (3, 1, 4)
SELECT t1.id1, t1.id2, t1.id3 FROM ;
(SELECT RECNO() as rn, id1, id2, id3 FROM test) t1 ;
JOIN ;
(SELECT MIN(rn) as rn FROM (SELECT min[id1, id2, id3] as mn, max[id1, id2, id3] as mx, id1+id2+id3 as sm, RECNO() as rn FROM test) t3 GROUP BY mn, mx, sm) t2 ;
ON t1.rn = t2.rn
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
Равиль
Автор

Сообщений: 6546
Откуда: Уфа
Дата регистрации: 01.08.2003
2 of63 leonid


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для трёх по моему проще так:

SELECT DISTINCT MIN[id1,id2,id3] i1, id1+id2+id3-MIN[id1,id2,id3]-MAX[id1,id2,id3] i2, MAX[id1,id2,id3] i3 FROM test

P.S. Я не очень доверяю трюкам с квадратными скобками, потому как правило делаю свои UDF типа greatest(), least() чтобы разрешить конфликт имён между агрегатной и "обычной" функцией min/max.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Igor Korolyov
Я не очень доверяю трюкам с квадратными скобками

Да, там есть свои "фичи"

CREATE CURSOR tmp (f1 i, f2 i)
INSERT INTO tmp values(1, 2)
SELECT PI() as pi, EXP[f1] as ex FROM tmp
SELECT PI[] as pi, EXP[f1] as ex FROM tmp
SELECT PI[] as pi, EXP(f1) as ex FROM tmp
SELECT PI() as pi, EXP(f1) as ex FROM tmp
SELECT min[f1, f2] as mn, PI() as pi, EXP[f1] as ex FROM tmp
SELECT min[f1, f2] as mn, PI[] as pi, EXP[f1] as ex FROM tmp
SELECT min[f1, f2] as mn, PI[] as pi, EXP(f1) as ex FROM tmp
SELECT min[f1, f2] as mn, PI() as pi, EXP(f1) as ex FROM tmp
SELECT PI() as pi, EXP[f1] as ex, min[f1, f2] as mn FROM tmp
SELECT PI[] as pi, EXP[f1] as ex, min[f1, f2] as mn FROM tmp
SELECT PI[] as pi, EXP(f1) as ex, min[f1, f2] as mn FROM tmp
SELECT PI() as pi, EXP(f1) as ex, min[f1, f2] as mn FROM tmp
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Равиль
Предлагаю усложнить задачу - найти уникальные тройки (правда практического интереса пока нет в этом - но кто знает - вдруг пригодится)

Осталось найти общую формулу для N полей.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 (Гостей: 24)

© 2000-2024 Fox Club 
Яндекс.Метрика