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

Откуда:
Сообщений: 194
Привет.
Есть данные -лог загрузок пользователя в систему. Скажем за 5 лет. Человек регистрируется на дню по 100 раз. Нужно выбрать последние 3 пароля которые он использовал за эти 5 лет. Сам лог такой:

RecId UserId UserName Password
70629 8 Lena 6b1bb6bf
70627 8 Lena 6
70517 8 Lena 6
70516 8 Lena 6
70515 8 Lena 6
...
70478 8 Lena 1
70477 8 Lena 1qwerty
70476 8 Lena 1qwerty

Запрос

select distinct top 3 "Password" from
LogonAudit where UserId=8
order by RecId DESC

выдает

6b1bb6bf
1

Ясно, что ордер бай работает не внутри select distinct и это проблема, но как решить проблему непонятно.
Можно ли решить задачу А. в Sql и B. в одном запросе (без SP, View)?
Спасибо
16 окт 12, 19:09    [13329151]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
А) можно
Б) только в секретных версиях сервера
16 окт 12, 19:14    [13329171]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
Чота типа так:

select top 3 * from (select Password, mRecId=max(RecId) group by Password) lasts order by mRecId desc

а?
16 окт 12, 19:22    [13329195]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
DECLARE @T TABLE (RecId INT,  UserId VARCHAR (20), UserName VARCHAR (20), Password VARCHAR(20))
INSERT @T VALUES 
(70629, '8', 'Lena', '6b1bb6bf') ,
(70627, '8', 'Lena', '6'),
(70517, '8', 'Lena', '6'),
(70516, '8', 'Lena', '6'),
(70515, '8', 'Lena', '6'),
(70478, '8', 'Lena', '1'),
(70477, '8', 'Lena', '1qwerty'),
(70476, '8', 'Lena', '1qwerty')



SELECT * FROM @T


select top 3 * from (select Password, mRecId=max(RecId) from @t group by Password) lasts order by mRecId desc

select top 3 Password from @t group by Password order by max(RecId) desc


Как работает последняя конструкция я не знаю....
16 окт 12, 19:36    [13329230]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
mabanza
Member

Откуда:
Сообщений: 194
Все сводится к селекту во from. Но я-то Pervasive-ский юзер. Там такая потеха не пройдет. Надо быстрее похерить этот Первэйзив.
Спасибо.
16 окт 12, 20:51    [13329436]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
Добрый Э - Эх
Guest
mabanza, вот так попробуй:
--
-- Это лишь эмуляция твоих тестовых данных
-- и при переносе решения в свои условия
-- этот кусок нужно просто проигнорить:
with
  t (RecId, UserId, UserName, Password) as
    (
        
      select 70629, 8, 'Lena', '6b1bb6bf' union all
      select 70627, 8, 'Lena', '6' union all
      select 70517, 8, 'Lena', '6' union all
      select 70516, 8, 'Lena', '6' union all
      select 70515, 8, 'Lena', '6' union all
      select 70478, 8, 'Lena', '1' union all
      select 70477, 8, 'Lena', '1qwerty' union all
      select 70476, 8, 'Lena', '1qwerty'
    ) 
--
-- Основной запрос (именно эта часть должна 
-- больше всего интересовать тебя):
select distinct t0.UserId, t0.UserName, t0.Password, 
       count(distinct t1.Password) as rn
  from t t0 -- вместо t ставишь название своей таблицы
  join t t1 -- вместо t ставишь название своей таблицы
    on t0.UserId = t1.UserId
   and t0.RecId <= t1.RecId
  group by t0.RecId, t0.UserId, t0.UserName, t0.Password
 having count(distinct t1.Password) <= 3
  order by rn

вроде все инструкции - примитивны. Должен и твой Pervasive потянуть их...
17 окт 12, 06:10    [13330532]     Ответить | Цитировать Сообщить модератору
 Re: Построить запрос с группировкой  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
mabanza, вот так попробуй:
Счас внимательно подумал - чистой воды "магия данных". В реальности работать не будет :(
17 окт 12, 06:55    [13330557]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить