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

Откуда:
Сообщений: 8
Всех приветствую!
MS SQL 2008
Имеется следующая таблица
id | date | log
100 300 "nmfnv In Pr dfdfd"
100 307 " dsdhfks shdkfhs"
100 310 " fhgjfsgh In Pr fgfs"
103 303 " sdfhsfh In Pr sfhs"
103 460 "sdfjs In Pr dfdf"
104 307 " dfhsjkf ahfkahfk"
104 309 " sdfsfs In Pr sdvfs"
107 329 " sdfsdgfsd In Pr"

Требуется, чтобы выводилось для каждого ID минимальная date, при условии, что поле log должно содержать In Pr.

то есть в нашем случае должно выйти что-то типа того
id | date | log
100 300 "nmfnv In Pr dfdfd"
103 303 " sdfhsfh In Pr sfhs"
104 309 " sdfsfs In Pr sdvfs"
107 329 " sdfsdgfsd In Pr"

Заранее спасибо!
15 авг 12, 15:38    [13015659]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
SELECT TOP(1) WITH TIES *
FROM таблица
WHERE log LIKE '%In Pr%'
ORDER BY ROW_NUMBER()OVER(ORDER BY [date]);
15 авг 12, 15:53    [13015752]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap,

SELECT TOP(1) WITH TIES *
FROM таблица
WHERE log LIKE '%In Pr%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY ID ORDER BY [date]);
15 авг 12, 16:12    [13015909]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
trew
iap,

SELECT TOP(1) WITH TIES *
FROM таблица
WHERE log LIKE '%In Pr%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY ID ORDER BY [date]);
О!
Тогда ещё правильнее:
SELECT TOP(1) WITH TIES *
FROM таблица
WHERE log LIKE '%In Pr%'
ORDER BY RANK()OVER(PARTITION BY id ORDER BY [date]);
Ведь минимумы-то бывают и равными друг другу!
15 авг 12, 16:15    [13015931]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
мимо
Guest
Sql говорит, что так:
select *
from (
SELECT *
,RANK()OVER(PARTITION BY id ORDER BY [date]) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1


, возможно, быстрее.
15 авг 12, 16:29    [13016039]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
Огромная благодарность откликнувшимся!
Подскажите пожалуйста, а как теперь сделать, чтобы выбиралась не минимальная, а максимальная дата?
16 авг 12, 14:02    [13020482]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
почитать про
ORDER BY
16 авг 12, 14:04    [13020495]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
HandKot
почитать про
ORDER BY


select *
from (
SELECT *
,RANK()OVER(PARTITION BY id ORDER BY [date] DESC) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1


Вот так? Заранее извиняюсь за глупые вопросы, задачу повесили очень срочную,а знакомство с SQL у меня началось вчера =)
16 авг 12, 14:51    [13020873]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
точно
16 авг 12, 14:53    [13020891]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 349
Всех приветствую!
MS SQL 2008
Имеется следующая таблица
id | date | log
100 300 "nmfnv In Pr dfdfd"
100 307 " dsdhfks shdkfhs"
100 310 " fhgjfsgh In Pr fgfs"
103 303 " sdfhsfh In Pr sfhs"
103 460 "sdfjs In Pr dfdf"
104 307 " dfhsjkf ahfkahfk"
104 309 " sdfsfs In Pr sdvfs"
107 329 " sdfsdgfsd In Pr"

Требуется, чтобы выводилось для каждого ID минимальная date, при условии, что поле log должно содержать In Pr.



Не понимаю, ещё ни один человек здесь не испоьзовал GROUP BY:

SELECT id, MIN(date)
FROM Таблица
WHERE log LIKE '%In Pr%'
GROUP BY id
16 авг 12, 15:39    [13021337]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
мимо
Sql говорит, что так:
select *
from (
SELECT *
,RANK()OVER(PARTITION BY id ORDER BY [date]) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1


, возможно, быстрее.


Работает отлично, но есть одно "НО" и оно критично, как можно сделать, чтобы если значения минимумов для одного id совпадали, выводилось только верхнее значение таблицы?
16 авг 12, 17:09    [13022093]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
SELECT TOP(1) WITH TIES *
FROM таблица
WHERE log LIKE '%In Pr%'
ORDER BY RANK()OVER(PARTITION BY id ORDER BY [date]);


Та же ситуация, если есть для одного id две минимальные date, то выводит оба значения.
16 авг 12, 17:24    [13022209]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
мимо
Guest
select *
from (
SELECT *
,ROW_NUMBER() OVER(PARTITION BY id ORDER BY  [date], id) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1
16 авг 12, 17:28    [13022237]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Для менее глазастых
мимо
select *
from (
SELECT *
,ROW_NUMBER() OVER(PARTITION BY id ORDER BY  [date], id) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1
16 авг 12, 19:02    [13022741]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Mnior
Для менее глазастых
мимо
select *
from (
SELECT *
,ROW_NUMBER() OVER(PARTITION BY id ORDER BY  [date], id) as r
FROM таблица
WHERE log LIKE '%In Pr%'
) as z
where z.r = 1

id не подойдет, оно там у всех в группе одинаковое.
Или пусть ashm укажет другую колонку, которая определяет "...верхнее значение таблицы..." при равных id+date или сервер сам себе это значение выберет
16 авг 12, 19:20    [13022810]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
Снова всех приветствую!
Подскажите пожалуйста, есть 2 запроса
Первый
SELECT TOP(1) WITH TIES t1.audit_date as AD1, t1.Original_request_id as ID1,t1.log as log1
FROM  HPD_HelpDesk_AuditLogSystem t1
WHERE t1.log LIKE '%Status: Assigned%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.Original_request_id ORDER BY t1.audit_date);


Второй
SELECT TOP(1) WITH TIES t2.audit_date as AD, t2.Original_request_id as ID,t2.log as log
FROM  HPD_HelpDesk_AuditLogSystem t2
WHERE t2.log LIKE '%Status: In Progress%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY t2.Original_request_id ORDER BY t2.audit_date);



Первый выводит
AD1 | ID1 | log1
555 | 1 | bhsfsStatus: Assignedfdgdgd
557 | 2 | gfgdgdgStatus: Assigneddsgg
662 | 15 | dfdgdgdStatus: Assigned fcgsdg



Второй выводит
AD2 | ID2 | log2
623 | 2 | bhsfsStatus: In Progressfdgdgd
885 | 15 | gfgdgdgStatus: In Progressdsgg
662 | 54 | dfdgdgdStatus: In Progress fcgsdg


в результате хочется объединение результатов этих запросов вида:
ID1 | AD1 | log1 | AD2 | log2
1 | 555 | bhsfsStatus: Assignedfdgdgd | NULL | NULL
2 | 557 | gfgdgdgStatus: Assigneddsgg | 623 | dgfdStatus: In Progressdg
15 | 662 | dfdgdgdStatus: Assigned fcgsdg | 15 | ddgdStatus: In Progressfgf


То есть по сути мне надо сделать Left inner join on t1.Original_request_id=t2.Original_request_id

Но с реализацией у меня проблемы,
Select t3.ID1 as ID, t3.AD1, t3.log1, t4.AD2, t4.log2
from 
(
(SELECT TOP(1) WITH TIES t1.audit_date as AD1, t1.Original_request_id as ID1,t1.log as log1
FROM  HPD_HelpDesk_AuditLogSystem t1
WHERE t1.log LIKE '%Status: Assigned%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.Original_request_id ORDER BY t1.audit_date)
) as t3
left inner join
(SELECT TOP(1) WITH TIES t2.audit_date as AD, t2.Original_request_id as ID,t2.log as log2
FROM  HPD_HelpDesk_AuditLogSystem t2
WHERE t2.log LIKE '%Status: In Progress%'
ORDER BY ROW_NUMBER()OVER(PARTITION BY t2.Original_request_id ORDER BY t2.audit_date)) as t4
on t3.ID1=t4.ID
)

не работает, пишет некорректный синтаксис около слова 'inner'

Как я понял, это в корне неверный подход, поэтому буду благодарен за варианты решения данной проблемы.
27 авг 12, 14:43    [13069942]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
автор
То есть по сути мне надо сделать Left inner join
27 авг 12, 14:46    [13069977]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

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

две полученные таблицы надо объединить по одному признаку, как я понял, джойном это сделать никак нельзя, поэтому вопрос, каким образом это можно сделать?
27 авг 12, 16:07    [13070811]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
smls
Guest
не бывает left inner join
или left join
или inner join
27 авг 12, 17:11    [13071396]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ashm,
Не совсем понял ...
+ так что ли нельзя сделать?

declare @t1 table
  (
    ad1 int
  , id1 int
  , log1 varchar(150)
  )
insert  into @t1
        ( ad1, id1, log1 )
values  ( 555, 1, 'bhsfsStatus: Assignedfdgdgd555' )
 ,      ( 557, 2, 'gfgdgdgStatus: Assigneddsgg557' )
 ,      ( 662, 15, 'gfgdgdgStatus: Assigneddsgg662' )
       
declare @t2 table
  (
    ad2 int
  , id2 int
  , log2 varchar(150)
  )
insert  into @t2
        ( ad2, id2, log2 )
values  ( 623, 2, 'bhsfsStatus: In Progressfdgdgd623' )
 ,      ( 885, 15, 'bhsfsStatus: In Progressfdgdgd885' )
 ,      ( 662, 54, 'bhsfsStatus: In Progressfdgdgd662' )
        

select  *
from    @t1 t1
left outer join @t2 as t2 on t1.id1 = t2.id2

27 авг 12, 17:13    [13071416]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
stassk8
Member

Откуда:
Сообщений: 55
select * from @t1
union 
select * from @t2
27 авг 12, 17:52    [13071718]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
stassk8
Member

Откуда:
Сообщений: 55
stassk8
select * from @t1
union 
select * from @t2


упс, не внимательно прочитал про объединение -)
27 авг 12, 17:55    [13071743]     Ответить | Цитировать Сообщить модератору
 Re: выбор нескольких минимальных значений  [new]
ashm
Member

Откуда:
Сообщений: 8
denis2710
ashm,
Не совсем понял ...
+
+ так что ли нельзя сделать?

declare @t1 table
  (
    ad1 int
  , id1 int
  , log1 varchar(150)
  )
insert  into @t1
        ( ad1, id1, log1 )
values  ( 555, 1, 'bhsfsStatus: Assignedfdgdgd555' )
 ,      ( 557, 2, 'gfgdgdgStatus: Assigneddsgg557' )
 ,      ( 662, 15, 'gfgdgdgStatus: Assigneddsgg662' )
       
declare @t2 table
  (
    ad2 int
  , id2 int
  , log2 varchar(150)
  )
insert  into @t2
        ( ad2, id2, log2 )
values  ( 623, 2, 'bhsfsStatus: In Progressfdgdgd623' )
 ,      ( 885, 15, 'bhsfsStatus: In Progressfdgdgd885' )
 ,      ( 662, 54, 'bhsfsStatus: In Progressfdgdgd662' )
        

select  *
from    @t1 t1
left outer join @t2 as t2 on t1.id1 = t2.id2



Огромное нечеловеческое спасибо за помощь! =) Именно так можно и нужно было сделать!
28 авг 12, 12:59    [13075327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить