SQL-запрос на первый проход - PullRequest
0 голосов
/ 03 ноября 2019

Допустим, у меня есть следующие записи в таблице.

Serial Number    Test Result    Start Time        End Time
=============================================================
1                 failed        4/4/2019 8:34   4/4/2019 9:06
1                 passed        4/4/2019 10:15  4/4/2019 10:36
2                 passed        4/5/2019 10:26  4/6/2019 10:37
3                 failed        4/7/2019 10:33  4/7/2019 11:15
3                 failed        4/7/2019 11:26  4/7/2019 11:37
3                 passed        4/8/2019 8:00   4/7/2019 8:15

Я пытаюсь написать запрос для вывода результата при первом запуске продукта.

Serial Number    Test Result    Start Time        End Time
=============================================================
1                 failed        4/4/2019 8:34   4/4/2019 9:06
2                 passed        4/5/2019 10:26  4/6/2019 10:37
3                 failed        4/7/2019 10:33  4/7/2019 11:15

Как бы я поступил так?

Ответы [ 3 ]

0 голосов
/ 03 ноября 2019
select t1.Serial as "Serial Number"
       , t1.Test as "Test Result"
       , t1.Start_time as "Start Time"
       , t1.End_Time as "End Time"
from testTable t1
where t1.Start_time = (
      select min(t2.Start_time) 
      from  testTable t2 
      where t2.serial = t1.serial);

Вот это ДЕМО

0 голосов
/ 03 ноября 2019

С NOT EXISTS:

select t.* from tablename t
where not exists (
  select 1 from tablename
  where [Serial Number] = t.[Serial Number] and [Start Time] < t.[Start Time]
)

вернет строку для каждого serialnumber с самым ранним starttime. Смотрите демо . Результаты:

> Serial Number | Test Result | Start Time          | End Time           
> ------------: | :---------- | :------------------ | :------------------
>             1 | failed      | 04/04/2019 08:34:00 | 04/04/2019 09:06:00
>             2 | passed      | 05/04/2019 10:26:00 | 06/04/2019 10:37:00
>             3 | failed      | 07/04/2019 10:33:00 | 07/04/2019 11:15:00
0 голосов
/ 03 ноября 2019

Вы можете фильтровать, используя коррелированный подзапрос:

select t.*
from t
where t.starttime = (select min(t2.starttime)
                     from t t2
                     where t2.serial_number = t.serial_number
                    );

Предполагается, что «first» основано на времени начала.

При индексе (serial_number, starttime) обычно это имеетлучшая производительность. Другой популярный подход использует row_number():

select t.*
from (select t.*,
             row_number() over (partition by serial_number order by starttime desc) as seqnum
      from t
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...