MSSQL Выбрать наибольшее значение из сгруппированных результатов - PullRequest
0 голосов
/ 11 октября 2018

Эта проблема сводит меня с ума.

У меня есть 2 таблицы:

Первая - user_account_log

id  username    invoiceid   log_datetime            log_type    log_entry
1   testuser    0       2006-03-30 17:38:14.0000000 Suspend     true 
2   testuser    0       2006-03-30 17:38:30.0000000 Un-Suspend  true 
3   testuser    0       2006-03-31 15:19:42.0000000 Suspend     true 
4   testuser2   0       2006-03-31 17:14:15.0000000 Un-Suspend  true 
5   testuser2   0       2006-03-31 17:15:18.0000000 Suspend     true 
6   testuser3   0       2006-04-06 16:13:59.0000000 Suspend     true 

и

user_account:

username    accountname datestart           dateend
testuser    product1    2000-08-30 23:59:59.0000000 2000-12-29 21:04:33.0000000
testuser2   product2    2000-08-28 14:10:03.0000000 2002-01-21 13:07:05.0000000
testuser3   product1    2000-08-28 16:17:06.0000000 2002-06-30 23:59:59.0000000

Как часть более крупного запроса - у меня есть оператор with со следующим кодом:

SELECT MAX(log_datetime) AS logtime, 
max(id) AS ID,
user_account_log.username, 
ua.accountname,     
log_type,
ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as temp
FROM user_account_log
left outer join user_account ua on ua.username = user_account_log.username
where ua.dateend is null
GROUP BY user_account_log.username, 
log_datetime,
ua.accountname, 
log_type

Но он не выводит то, что мне нужно - текущий набор результатов выглядит следующим образом:

logtime             ID  username    accountname     log_type    temp
2011-11-17 15:18:23.0000000 34736   testuser    product1        Un-Suspend  61
2011-11-17 15:18:23.0000000 34736   testuser    product2        Un-Suspend  62
2012-12-10 10:35:08.0000000 35607   testuser    product1        Suspend     63
2012-12-10 10:35:08.0000000 35607   testuser    product2        Suspend     64
2013-09-04 17:09:09.0000000 36587   testuser    product1        Un-Suspend  65
2013-09-04 17:09:09.0000000 36587   testuser    product2        Un-Suspend  66

что мне нужно сделать, это взять самый последний журнал (используя либо время журнала, либо ID), но мне нужно убедиться, что он сгруппирован по всем продуктам, поэтому ожидаемый результат будет ограничен таким образом:

logtime             ID  username    accountname     log_type    temp
2013-09-04 17:09:09.0000000 36587   testuser    product1        Un-Suspend  65
2013-09-04 17:09:09.0000000 36587   testuser    product2        Un-Suspend  66

Я уверен, что есть что-то очевидное, что я упускаю в этом выборе - но я провел большую часть дня с различными результатами, которые не похожи на результатустановите, что мне нужно.

Я также удалил все конфиденциальные данные - поэтому не беспокойтесь, что вывод отличается от фрагмента таблицы, которую я включил выше.

Любая помощь будетс благодарностьюСпасибо

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Я не уверен, что правильно понял ваши требования или нет, но из того, что вы объяснили и из того, что я понял, я думаю, вы можете попытаться выполнить запрос после удаления «log_datetime» из предложения GROUP BY и «ROW_NUMBER».'не используется напрямую, тогда я думаю, что вы не нуждаетесь в этом выборе (в случае, если вам это нужно, вы всегда можете добавить его).Попробуйте выполнить нижеприведенный оператор SELECT, если это поможет.

SELECT
    MAX(log_datetime) AS logtime, 
    MAX(id) AS ID,
    user_account_log.username, 
    ua.accountname,     
    log_type
    --,ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as temp
FROM user_account_log
LEFT OUTER JOIN user_account ua ON ua.username = user_account_log.username
WHERE ua.dateend IS NULL
GROUP BY
    user_account_log.username, 
    --log_datetime,
    ua.accountname, 
    log_type

Дайте мне знать, если запрос не дает ожидаемого результата.

0 голосов
/ 12 октября 2018

Мне удалось найти решение (хотя оно еще не полностью записано в основной объем скрипта), которое выбрало верхний идентификатор для каждой группы строк:

select t.*
from (select *,
             max(id) over (partition by username) as max1,
             max(log_datetime) over (partition by username) as max2
      from user_account_log
     ) t
     where t.id = t.max1

Благодаря 2 авторам, которыеответил, хотя ни один не был ответ - это помогло направить меня в правильном направлении

0 голосов
/ 11 октября 2018

попробуйте ниже

select * from 
(SELECT *,
ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as rn
FROM user_account_log
left outer join user_account ua on ua.username = user_account_log.username
where ua.dateend is null)a where rn=1
...