2016-11-17 3 views
0

Это мой SQL таблицаКак отфильтровать строки по дате Max и Max Id

RecordID  RecordState  Time 
----------------------------------- 
record1  failed   1:00 
record1  passed   2:00 

record2  passed   2:15 

record3  failed   3:00 

record4  passed   4:00 
record4  failed   5:00 

мне нужно выбрать только «не удалось» записей.

select RecordID, max(RecordState) 
from RecordTable a 
inner join RecordStateTable b 
on a.recordID = b.recordID 
group by RecordID 

Это тянет все записи потерпеть неудачу, но проблема здесь record4, где значение было первым прошло, и затем не так (макс recordstate) для этой записи передается. Мне также нужно изменить его для Max (Time), но я не могу понять, как это сделать.

Ожидаемый результат record3(failed),record4(failed)

+0

Итак, ваши результаты должны содержать только запись 3? или обе записи 3 и 4? – xQbert

+0

Можете ли вы добавить ожидаемый результат –

+0

У вас есть две таблицы? Вы запрашиваете, что у вас есть RecordTable и RecordStateTable, но ваш вопрос предполагает, что у вас есть только одна таблица. –

ответ

0

Вместо выбора максимального состояния, которое может привести к весьма неожиданным результатам (так как это просто строка) - вы можете выбрать max(Time) для каждого RecordID, а затем принимать только записи, не сумев состояние при макс время:

select T1.* 
from 
(
    select 
     RecordID, 
     max(Time) as Time 
    from RecordStateTable 
    group by RecordID 
) as T 
    inner join RecordStateTable as T1 on T1.RecordID = T.RecordID and T1.Time = T.Time 
where T1.RecordState = 'failed' 
0

Вы можете использовать аналитическую функцию (окно), чтобы получить максимальное время для каждого RecordId и показывать только максимальные времена записи в неисправном состоянии.

with CTE AS (
Select RecordID, RecordState, Time, max(time) over (partition by RecordID) mt 
FROM table) 
Select * from cte where mt = time and recordState = 'failed' 
0

Try что-то вроде этого

Select * From 
(
select *, 
     row_number()over(partition by RecordID order by [time] desc) as rn 
from yourtable 
) A 
Where RN = 1 and RecordState = 'Failed' 

Использование Row_number для определения максимального time для каждого RecordID и фильтровать максимальное время вместе с RecordState = 'Failed'

0

Предполагая, что вы хотите вернуть последний результат от каждого протокол:

declare @RecordTable TABLE (
     RecordID varchar(10), 
     RecordState varchar(10), 
     [Time] time 
    ) 

    insert into @RecordTable 
    values 
     ('record1', 'failed', '1:00'), 
     ('record1', 'passed', '2:00'), 
     ('record2', 'passed', '2:15'), 
     ('record3', 'failed', '3:00'), 
     ('record4', 'passed', '4:00'), 
     ('record4', 'failed', '5:00') 

    select a.RecordID, a.RecordState, b.[Time] 
    from @RecordTable a 
     inner join (
      select RecordID, max([Time]) as [Time] 
      from @RecordTable 
      group by RecordID 
     ) b on b.RecordID = a.RecordID and a.[Time] = b.[Time] -- only return the most recent version 

    --record4 failed 05:00:00.0000000 
    --record3 failed 03:00:00.0000000 
    --record2 passed 02:15:00.0000000 
    --record1 passed 02:00:00.0000000 

Получает max(Time) для каждой записи и захватывает статус из этой строки. Если вам нужны только неудачные (или переданные) записи, просто добавьте where a.RecordState = 'whatever'.

0

Это возвращает последний раз только с неудавшегося статусом

select RecordID,RecordState row_number 
over (partition by recordID 
order by Time desc) as rn from 
yourtable 
where RecordState = 'failed' and rn = 1 
+0

Это не работает? Наверняка вы пропустили некоторые запятые и круглые скобки, и даже тогда я не верю, что вы можете получить доступ к rn в разделе where? –

+0

Это действительно сработало для меня/и, конечно же, вы можете получить доступ к rn, где –

+0

Вы явно оставили некоторые вещи, у вас есть две закрывающиеся круглые скобки и одна открывающая скобки. Ваш выбор недействителен, и я не вижу, как rn может существовать в этом предложении where. Возможно, вы хотели использовать встроенный запрос, такой же, как Prdp? –

0

Я хотел бы использовать ОТНОСИТЬСЯ, чтобы сделать это.

SELECT rt.RecordID, ca.RecordState 
FROM RecordTable rt 
CROSS APPLY (SELECT TOP 1 RecordState, Time 
      FROM RecordTable 
      WHERE RecordID = rt.RecordID 
      ORDER BY Time DESC) ca 
WHERE rt.Time = ca.Time AND ca.RecordState = 'failed' 

По вашему запросу, я подозреваю, что на самом деле есть две таблицы. Предполагая, что RecordID является PK на вашем RecordTable, вы можете упростить это.

SELECT rt.RecordID, ca.RecordState 
FROM RecordTable rt 
CROSS APPLY (SELECT TOP 1 RecordState 
      FROM RecordStateTable 
      WHERE RecordID = rt.RecordID 
      ORDER BY Time DESC) ca 
WHERE ca.RecordState = 'failed'