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

Откуда:
Сообщений: 2083
Здравствуйте! Есть таблица примерно такого содержания:
iidxstatdata
1Статус 123.01.2012
1Статус 124.01.2012
1Статус 225.01.2012
2Статус 023.01.2012
2Статус 224.01.2012
2Статус 225.01.2012

Нужно получить строки с максимальной датой у Статусов 1 или 2:
idxstatdata
1Статус 124.01.2012
2Статус 225.01.2012

Здесь ведется работа только со Статусами = 1 или 2. Строки с другими статусами отсеиваются.
Статус 1 имеет преимущество перед Статусом 2, и если у idx встречаются одновременно 1 и 2, то работа ведется только со Статусом 1.

Тестовые данные:
declare @t table (idx int, stat varchar(50), data datetime)
insert @t
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 2', '20120125'

select idx, stat, convert(char(10),data,104) [data] from @t

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1746.0 (X64)   Oct  5 2010 12:32:09   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: ) (Hypervisor) 

+ Мое не очень хорошее решение
select top 1 with ties *
from (
  select idx, 'Статус 1' [stat], max(data) [md]
  from @t
  where stat = 'Статус 1'
  group by idx
  union all
  select idx, 'Статус 2', max(data) [md]
  from @t
  where stat = 'Статус 2'
  group by idx
) t  
order by row_number() over(partition by idx order by stat)
11 апр 12, 12:12    [12398261]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
AmKad
Member

Откуда:
Сообщений: 5310
user89,

with s (idx , stat , data) as (
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 2', '20120125')
select top 1 with ties *
from s
where stat in ('Статус 1', 'Статус 2')
order by row_number() over (partition by stat order by data desc)
11 апр 12, 12:30    [12398419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
AmKad,
спасибо, действительно, все просто!
11 апр 12, 12:39    [12398502]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
AmKad,
не совсем правильно :(
user89
Статус 1 имеет преимущество перед Статусом 2, и если у idx встречаются одновременно Статусы 1 и 2, то работа ведется только со Статусом 1.
На таких данных
declare @t table (idx int, stat varchar(50), data datetime)
insert @t
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 1', '20120125' 
Должно получиться
idxstatmd
1Статус 12012-01-24 00:00:00.000
2Статус 12012-01-25 00:00:00.000
11 апр 12, 13:57    [12399306]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
user89,

order by row_number() over (partition by idx order by stat asc, data desc)
11 апр 12, 14:05    [12399382]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
with s (idx , stat , data) as (
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 2', '20120125')
,states as(select top(1) with ties * from s where stat in ('Статус 1', 'Статус 2') order by rank() over (partition by idx order by stat))
select top(1) with ties *
from states
order by row_number() over (partition by stat order by data desc);
11 апр 12, 14:15    [12399481]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Guf,
вроде правильно, сейчас попробую на реальной базе...

iap,
на таких данных
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 1', '20120125' 
выдал
idxstatdata
1Статус 12012-01-24 00:00:00.000
:(

Должно быть
idxstatmd
1Статус 12012-01-24 00:00:00.000
2Статус 12012-01-24 00:00:00.000
11 апр 12, 14:41    [12399763]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
user89,

with s (idx , stat , data) as (
  select 1, 'Статус 1', '20120123' union all
  select 1, 'Статус 1', '20120124' union all
  select 1, 'Статус 2', '20120125' union all
  select 2, 'Статус 0', '20120123' union all
  select 2, 'Статус 2', '20120124' union all
  select 2, 'Статус 1', '20120125' )
,states as(select top(1) with ties * from s where stat in ('Статус 1', 'Статус 2') order by rank() over (partition by idx order by stat))
select top(1) with ties *
from states
order by row_number() over (partition by stat, idx order by data desc);

?
11 апр 12, 14:58    [12399930]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
user89
Должно быть
idxstatmd
1Статус 12012-01-24 00:00:00.000
2Статус 12012-01-24 00:00:00.000

может должно быть:
idxstatmd
1Статус 12012-01-24 00:00:00.000
2Статус 12012-01-25 00:00:00.000

?
11 апр 12, 15:02    [12399977]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
kDnZP
может должно быть:
idxstatmd
1Статус 12012-01-24 00:00:00.000
2Статус 12012-01-25 00:00:00.000

?
Да, конечно.
11 апр 12, 15:08    [12400037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
kDnZP,
вариант
select top(1) with ties *
from states
order by row_number() over (partition by stat, idx order by data desc);
подходит, спасибо!
11 апр 12, 15:10    [12400056]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить