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

create table #zzz(schet int, type int, znach int)

insert into #zzz
select 1,1,2
union
select 1,2,3
union
select 1,3,4
union
select 1,4,5
union
select 2,1,3
union
select 2,2,4


schettypeznach
112
123
134
145
213
224


Необходимо для каждого schet вывести одну из пар типов (1 или 2), (3 или 4).
Таких типов пар - 5 штук.


На выходе чтобы получить вот такое
schettypeznach
112
134
213


Сделал вот так:
select * from #zzz z
where type in (select top 1 type from #zzz z1 where z.schet=z1.schet and (type in (1,2)))
		or
	  type in (select top 1 type from #zzz z1 where z.schet=z1.schet and (type in (3,4)))



Можно ли это изобразить как-нибудь более красивее, правильнее и возможно быстрее на больших объемах данных?
2 дек 11, 13:58    [11696055]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SELECT TOP(1) WITH TIES *
FROM #zzz
WHERE [type]IN(1,2,3,4)
ORDER BY ROW_NUMBER()OVER(PARTITION BY schet,[type]/3%2 ORDER BY(SELECT 0));
2 дек 11, 14:16    [11696219]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
aleks2
Guest
select * FROM
(
select *, ROW_NUMBER() OVER(partition BY schet, (type-1)/2 ORDER BY type) n from @zzz z
where type between 1 and 4 
) X
where n=1
2 дек 11, 14:16    [11696224]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Или
SELECT TOP(1) WITH TIES *
FROM #zzz
WHERE [type]IN(1,2,3,4)
ORDER BY ROW_NUMBER()OVER(PARTITION BY schet,[type]/3%2 ORDER BY [type]);
2 дек 11, 14:18    [11696239]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
выборка по типу
Guest
iap, aleks2

Пары могут быть (3 и 10), (5 и 7), (12 и 150), (300 и 1400) и (1050 и 1200).

Это я для примера привел простые пары. На самом деле у них цифры разнообразные.
2 дек 11, 14:19    [11696242]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
aleks2
Guest
Ну нахерачь CASE или заведи справочник пар.
Чо так тупить то?
2 дек 11, 14:22    [11696272]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
aleks2
Ну нахерачь CASE или заведи справочник пар.
Чо так тупить то?
+1000
Причём справочник лучше!
И универсальнее
2 дек 11, 14:38    [11696419]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
выборка по типу
Guest
ага, сделал справочник , сджойнил и отордерил как в примере выше через TIES.

Спасибо!
2 дек 11, 15:27    [11696913]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
WITH
 ZZZ AS
 (
  SELECT * FROM
  (
   VALUES
    (1,1,2)
   ,(1,2,3)
   ,(1,3,4)
   ,(1,4,5)
   ,(2,1,3)
   ,(2,2,4)
  )T(schet,[type],znach)
 )
,Pairs AS
 (SELECT * FROM
  (
   VALUES
    (1,1,2)
   ,(2,3,4)
   ,(3,3,10)
   ,(4,5,7)
   ,(5,12,150)
   ,(6,300,1400)
   ,(7,1050,1200)
  )T(ID, Value1, Value2))
SELECT TOP(1) WITH TIES Z.*
FROM ZZZ Z
JOIN Pairs P ON Z.[type] IN(P.Value1,P.Value2)
ORDER BY ROW_NUMBER()OVER(PARTITION BY Z.schet,P.ID ORDER BY Z.[type]);
2 дек 11, 15:37    [11697026]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
выборка по типу
Guest
iap, спасибо большое!

Как всегда большой вам респект и уважение!
2 дек 11, 15:39    [11697058]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
выборка по типу
iap, спасибо большое!

Как всегда большой вам респект и уважение!
Только то, что у меня написано в CTE ZZZ,
у Вас должно бы быть в таблице-справочнике.
Чтобы летало, так сказать...
2 дек 11, 15:47    [11697145]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по одному значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
выборка по типу
iap, спасибо большое!

Как всегда большой вам респект и уважение!
Только то, что у меня написано в CTE ZZZ,
у Вас должно бы быть в таблице-справочнике.
Чтобы летало, так сказать...
И Pairs, вообще-то, тоже тпаблица.
Тут это только ддля примера CTE сделано
2 дек 11, 15:48    [11697172]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить