2017-02-15 8 views
1

У меня есть две таблицы, названные инцидентам и действие. В каждом инциденте много действий. Каждое действие имеет отметку времени, когда оно было завершено.Как проверить, если запись имеет самую старую метку времени или не в один-ко-многим присоединиться к MSSQL

Я хочу, чтобы выбрать все действия, как это:

select action.completed, * from action 
left join incident on incident.id = action.incidentid 

, а затем я хочу, чтобы создать логическое значение, которое говорит мне, если каждое действие является первым завершено или нет, в случае инцидента.

Пример: для инцидента 2 действие 6 завершено первым. Для случая 3 сначала было выполнено действие 10. Это выход я хочу:

completed   | completed_first | actionid | incidentid | ... 
---------------------+-----------------+----------+------------+----- 
2017-01-01 02:23:30 | false   |  5 | 2  | 
2017-01-01 01:00:00 | true   |  6 | 2  | 
2017-01-01 05:23:30 | false   |  7 | 2  | 
2017-01-01 00:30:00 | false   |  8 | 3  | 
NULL     | false   |  9 | 3  | 
2017-01-01 00:10:00 | true   | 10 | 3  | 

Так как я генерировать completed_first колонку?

Обратите внимание, что завершено = NULL не может считаться выполненным.

ответ

1

ROW_NUMBER в КТР и случай:

with ACTION_T as 
(
select a1.*, 
     row_number() over(partition by incidentid 
         order by coalesce(completed, 
              getdate())) as a_ord -- Using a getdate() to handle nulls 
from action a1 
) 
select completed, 
     case when a_ord = 1 then 'true' else 'false' end as completed_first, 
     actionid, 
     incidentid 
from ACTION_T 
+0

'NULL' сорт первый, вам необходимо исключить его – AakashM

+0

@AakashM Спасибо, обработали его в редактировании – JohnHC

+0

Спасибо, что работали! – PeterFisk

0

В надежде, я правильно понял проблему.

Пожалуйста, проверьте ниже запрос

SELECT completed , 
    CASE 
    WHEN rn = 1 
    THEN 'true' 
    ELSE 'false' 
    END AS completed_first , 
    actionid , 
    incidentid 
FROM 
    (SELECT action.completed, 
    actionid , 
    incidentid , 
    row_number() over (partition BY incidentid order by coalesce(action.completed,DATEADD(day, 1, GETDATE()))) rn 
    FROM action 
    LEFT JOIN incident 
    ON incident.id = action.incidentid 
) a 
+0

'NULL' сортирует сначала, его нужно исключить – AakashM

+0

Да, обновлен akash-запрос. Спасибо – Tajinder

-1
Create table [action] (Actionid int, incidentid int, [Completed] datetime) 

    Create table Incident (Incidentid int) 

    insert into [incident] values (2), (3) 

    insert into [action] values (5 ,2 ,'2017-01-01 02:23:30') 
           , (6, 2,'2017-01-01 01:00:00') 
           , (7, 2,'2017-01-01 05:23:30') 
           , (8, 3,'2017-01-01 00:30:00') 
           , (9, 3, null) 
           , (10, 3, '2017-01-01 00:10:00') 

Если каждый Инциденты не имеет несколько одинаковых раз:

select action.completed, iif(First.incidentid is null, 'False', 'True') as [Completed_First], action.Actionid, action.incidentID, incident.* 
from action 
left join incident on incident.Incidentid = action.incidentid 
left join (
Select IncidentID, min(completed) as F_Completed 
from ACTION 
Group BY IncidentID) First on action.incidentid=first.incidentID and action.completed=first.F_Completed 

Вмещает Инциденты с несколькими идентичными раз:

select action.completed, iif(First.M_Actionid is null, 'False', 'True') as [Completed_First], action.Actionid, action.incidentID, incident.* 
from action 
left join incident on incident.Incidentid = action.incidentid 
left join (
Select min(ActionID) as M_ActionID 
from action 
inner join (
select incidentid, min(completed) as M_Completed 
from action 
group by incidentid) ICMin on action.incidentID = icmin.incidentID and action.completed= icmin.m_completed 
group by action.incidentid) First on action.actionid=first.M_ActionID 
+0

Спасибо! Это почти то, что я пытался сначала, но я не получил его на работу. – PeterFisk