Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
Есть таблица:
номерзначение
1ааааа
2ааааа
3ааааа
1ввввв
2ввввв
1ссссс
2ссссс
2ддддд
3ддддд
3еееее

Нужно чтоб остались значения где нет номера 1, но есть все остальные, в данном случаи 2 и 3.
Т.е. для нашего примера должно остаться только ддддд.
1 июл 09, 21:57    [7365861]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
как минимум поля не хватает, которое определяет порядок следования. без него задача не имеет смысла
1 июл 09, 22:00    [7365866]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Qwed86
есть все остальные, в данном случаи 2 и 3.
Откуда можно узнать, что это за ВСЕ ОСТАЛЬНЫЕ и сколько их?
1 июл 09, 22:06    [7365884]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Могу только догадываться
SELECT [значение]
FROM T
GROUP BY [значение]
HAVING MAX([номер])*(MAX([номер])+1)/2=SUM(DISTINCT [номер])+1;
1 июл 09, 22:18    [7365910]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
2 iap

это если их на группы побить - то да, ты оставишь только нужные группы. но тогда можно просто оставлять те, где сумма == 5 да и все. но щаз не то что группы - порядок не определен, точнее не материализован, определен он в голове автора :)
1 июл 09, 22:20    [7365916]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Crimean
но тогда можно просто оставлять те, где сумма == 5 да и все
А почему 5?
Я предположил, что для каждого [значение] должны быть все [номер] от 2 до MAX (без 1)
1 июл 09, 22:30    [7365944]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
> почему 5?

а я по-простому:

> Нужно чтоб остались значения где нет номера 1, но есть все остальные, в данном случаи 2 и 3

то есть если в группе будет 5 - оно нам как раз надо
а в сложном случае я п в сторону "булевых агрегатов" смотрел - проще и понятнее код будет
1 июл 09, 22:32    [7365952]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Crimean
а в сложном случае я п в сторону "булевых агрегатов" смотрел - проще и понятнее код будет
Сумма первых N членов арифметической прогрессии с шагом 1 - это разве не очень просто?
1+2+3+4+5=5*(5+1)/2
1 июл 09, 22:46    [7365974]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
> Сумма первых N членов арифметической прогрессии с шагом 1
а я не про "просто" говорил, а про "сложно"
1 июл 09, 22:48    [7365980]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
iap
Спасибо, но что-то на реальной программе не совсем правильно работает, точно всё так, может другой вариант есть?

Номеров может быть сколько угодно, просто значениям соответствуют номера и после запроса нужно чтоб остались только значения где нет номера предположим 1, но есть все остальные номера. Т.е. если номеров 5 то нужно оставить значения у которых нет 1, но есть 2,3,4,5.
1 июл 09, 22:59    [7366000]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Добрый Э - Эх
Guest
;with
--
-- Тестовые данные:
  t ([НОМЕР], [ЗНАЧЕНИЕ]) as 
    (
      select 1, 'ааааа' union all
      select 2, 'ааааа' union all
      select 3, 'ааааа' union all
      select 1, 'ввввв' union all
      select 2, 'ввввв' union all
      select 1, 'ссссс' union all
      select 2, 'ссссс' union all
      select 2, 'ддддд' union all
      select 3, 'ддддд' union all
      select 3, 'еееее' 
    )
--
-- Основной запрос:
select [ЗНАЧЕНИЕ]
  from t as t0
 where not exists(
                   select null 
                     from t as t1 
                    where t1.[ЗНАЧЕНИЕ] = t0.[ЗНАЧЕНИЕ] 
                      and t1.[НОМЕР] = 1
                 )
 group by [ЗНАЧЕНИЕ]
having (select count(distinct [НОМЕР]) 
          from t 
         where [НОМЕР] != 1) = count(distinct [НОМЕР]);

ЗНАЧЕНИЕ
ддддд
2 июл 09, 05:24    [7366432]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Добрый Э - Эх
Guest
Как вариант, можно ещё и вот такое попробовать:
;with
--
-- Тестовые данные:
  t ([НОМЕР], [ЗНАЧЕНИЕ]) as 
    (
      select 1, 'ааааа' union all
      select 2, 'ааааа' union all
      select 3, 'ааааа' union all
      select 1, 'ввввв' union all
      select 2, 'ввввв' union all
      select 1, 'ссссс' union all
      select 2, 'ссссс' union all
      select 2, 'ддддд' union all
      select 3, 'ддддд' union all
      select 3, 'еееее' 
    )
--
-- Основной запрос:
select [ЗНАЧЕНИЕ]
  from t as t0
 group by [ЗНАЧЕНИЕ]
having count(case when [НОМЕР] = 1 then 1 end) = 0
   and (select count(distinct [НОМЕР]) 
          from t 
         where [НОМЕР] != 1) = count(distinct [НОМЕР]);
2 июл 09, 05:48    [7366438]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
Добрый Э - Эх
Спасибо.
2 июл 09, 07:04    [7366460]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Qwed86
iap
Спасибо, но что-то на реальной программе не совсем правильно работает, точно всё так, может другой вариант есть?

Номеров может быть сколько угодно, просто значениям соответствуют номера и после запроса нужно чтоб остались только значения где нет номера предположим 1, но есть все остальные номера. Т.е. если номеров 5 то нужно оставить значения у которых нет 1, но есть 2,3,4,5.
Можно посмотреть на пример данных, для которых не работает?
2 июл 09, 08:32    [7366574]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
iap
Qwed86
iap
Спасибо, но что-то на реальной программе не совсем правильно работает, точно всё так, может другой вариант есть?

Номеров может быть сколько угодно, просто значениям соответствуют номера и после запроса нужно чтоб остались только значения где нет номера предположим 1, но есть все остальные номера. Т.е. если номеров 5 то нужно оставить значения у которых нет 1, но есть 2,3,4,5.
Можно посмотреть на пример данных, для которых не работает?


судя по условию любой набор где есть разрывы в последовательности

;with
--
-- Тестовые данные:
  t ([НОМЕР], [ЗНАЧЕНИЕ]) as 
    (
      select 1, 'ааааа' union all
      select 2, 'ааааа' union all
      select 3, 'ааааа' union all
      select 1, 'ввввв' union all
      select 2, 'ввввв' union all
      select 1, 'ссссс' union all
      select 2, 'ссссс' union all
      select 2, 'ддддд' union all
      select 3, 'ддддд' union all
      select 3, 'еееее' union all
      select 7, 'ддддд'
    )
2 июл 09, 10:03    [7366869]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ветерочек
судя по условию любой набор где есть разрывы в последовательности
О каких разрывах речь, если
Qwed86
Нужно чтоб остались значения где нет номера 1, но есть все остальные, в данном случаи 2 и 3.
Т.е. для нашего примера должно остаться только ддддд.
Так что всё работает у меня.
Ведь в данном примере для ддддд кроме 1 нет ещё 4,5 и 6
2 июл 09, 10:17    [7366931]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
iap
Я сейчас далеко от приложения чтоб всё проверить, я даже пока не успел проверить как работает то что предложил Добрый Э - Эх.
Возможно причина в том что номера не обязательно идут по порядку. Т.е. номера могут быть 1,3,5.
И нужно чтоб остались значения где нет 1, но есть 3 и 5.
Вечером все посмотрю и сообщу что как.
2 июл 09, 11:19    [7367227]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Qwed86
iap
Я сейчас далеко от приложения чтоб всё проверить, я даже пока не успел проверить как работает то что предложил Добрый Э - Эх.
Возможно причина в том что номера не обязательно идут по порядку. Т.е. номера могут быть 1,3,5.
И нужно чтоб остались значения где нет 1, но есть 3 и 5.
Вечером все посмотрю и сообщу что как.
А 4 куда делось? Говорили, что все должны быть, без пропусков, кроме 1. А теперь вон как всё повернулось!
Где там у меня используется порядок? В сумме? В максимуме?
2 июл 09, 11:36    [7367339]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Qwed86
Есть таблица:
номерзначение
1ааааа
2ааааа
3ааааа
1ввввв
2ввввв
1ссссс
2ссссс
2ддддд
3ддддд
3еееее

Нужно чтоб остались значения где нет номера 1, но есть все остальные, в данном случаи 2 и 3.
Т.е. для нашего примера должно остаться только ддддд.



а почему ответ только ддддд?
куда делось еееее, у него тоже нет 1!!!



declare @t table (id int, Name varchar(50))
INSERT into @t
select 1 as ID, 'ааааа' as Name union all
      select 2, 'ааааа' union all
      select 3, 'ааааа' union all
      select 1, 'ввввв' union all
      select 2, 'ввввв' union all
      select 1, 'ссссс' union all
      select 2, 'ссссс' union all
      select 2, 'ддддд' union all
      select 3, 'ддддд' union all
      select 3, 'еееее'


SELECT A.Name FROM
(select Name from @t group by Name) A LEFT OUTER JOIN 
(select 1 as id, Name from @t where id=1 GROUP BY Name) B ON A.Name=B.Name
WHERE B.id IS NULL
2 июл 09, 11:41    [7367372]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
iap
Насколько я помню в таблице где то 6000-9000 строк, значениям соответствуют 3 номера, и после запроса предложенного тобой остается 5-6 строк, есть значения которым принадлежат оставшиеся 2 номера, но и есть 2-3 значения которым принадлежит только один номер, хотя из условия следует что оставшимся значениям должно соответствовать все оставшиеся номера, т.е. без Distinct оставшиеся значения должны дублироватся при трех номерах.
2 июл 09, 11:41    [7367374]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
Konst_One
автор
нет номера 1, но есть все остальные, в данном случаи 2 и 3.
2 июл 09, 11:43    [7367386]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
iap
автор
Говорили, что все должны быть, без пропусков, кроме 1.

Что-то не помню где?) Просто я не уточнил до конца.
2 июл 09, 11:45    [7367406]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Qwed86
Konst_One
автор
нет номера 1, но есть все остальные, в данном случаи 2 и 3.


2 и 3 из общей выборки по другим значениям?

т.е. вы так хотите определять кол-во значений:

select id from @t group by id
2 июл 09, 11:46    [7367410]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Qwed86
iap
автор
Говорили, что все должны быть, без пропусков, кроме 1.

Что-то не помню где?) Просто я не уточнил до конца.
Ретроградная амнезия? Перечитайте свой стартовый пост.
Умеете задачу объяснить, ничего не скажешь!
И пример данных, для которых "не работает", от Вас не добьёшься, я уже понял.
2 июл 09, 11:58    [7367503]     Ответить | Цитировать Сообщить модератору
 Re: Исключающий запрос  [new]
Qwed86
Member

Откуда:
Сообщений: 25
Konst_One
Я вас не совсем понимаю.
Есть набор каких-нибудь значений и есть нобор номеров, предположим 1,3,5
Мы решили каждому значению присвоить номера, кому - все 3, кому - два, кому - один номер.
И теперь нужно сделать выборку чтобы остались значения которым не соответствует номер 1, но которым мы присвоили все остальные, в данном случаи 3,5.
Вот что я хочу.
2 июл 09, 11:58    [7367505]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить