Доступ к SQL для возврата только первого или последнего вхождения по дате - PullRequest
0 голосов
/ 25 сентября 2018

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

У меня есть исходная таблица из базы данных доступа, которая содержит столбцы: date, time, EP (точка входа), ID и остальные столбцы являются просто информационными, Нет первичного ключа , Изменение таблицы является последним решением.

DateOS      TimeOS     EP    ID    Val1    Val2    Val3     Val4
1.2.2017    1:00:02    in    15    6280    blue    line1    s
1.2.2017    3:00:06    in    15    6280    blue    line1    s
1.2.2017    4:00:08    in    16    3147    red     line2    s
1.2.2017    5:00:10    out   20    6280    white   line3    c
1.2.2017    6:00:12    out   20    6280    white   line3    c
2.2.2017    2:00:04    in    16    3147    red     line2    s

Мне нужно получить только первый (зеленый в ожидаемый результат )

DateOS      TimeOS     EP    ID    Val1    Val2    Val3     Val4
1.2.2017    1:00:02    in    15    6280    blue    line1    s
1.2.2017    4:00:08    in    16    3147    red     line2    s
1.2.2017    5:00:10    out   20    6280    white   line3    c

/ последний (красный ожидаемый результат ), в которых встречаются уникальные комбинации EP и ID.

DateOS      TimeOS     EP    ID    Val1    Val2    Val3     Val4
1.2.2017    3:00:06    in    15    6280    blue    line1    s
1.2.2017    6:00:12    out   20    6280    white   line3    c
2.2.2017    2:00:04    in    16    3147    red     line2    s

Я получил идеи от: Получить первый экземпляр строки, используя MS Access

Пока у меня есть это (функция min для функции first / max для последней):

SELECT
    FORMAT(pt.DateOS, 'dd.MM.yyyy') AS DateOS, 
    FORMAT(pt.TimeOS, 'HH:mm:ss') AS TimeOS, 
    pt.EP, pt.ID, pt.Val1, pt.Val2, pt.Val3, pt.val4
FROM [test07_dupl2] AS pt 
WHERE TimeOS 
IN
(
SELECT
    MIN(TimeOS) AS MinDateTimeOS 
FROM [test07_dupl2]
GROUP BY EP+ID
)

И это результат .Это касается только TimeOS.Вторая строка там не принадлежит, потому что это более поздняя дата.

DateOS      TimeOS     EP    ID    Val1    Val2    Val3     Val4
1.2.2017    1:00:02    in    15    6280    blue    line1    s
2.2.2017    2:00:04    in    16    3147    red     line2    s
1.2.2017    5:00:10    out   20    6280    white   line3    c

Проблема в том, что мне нужно учитывать DateOS + TimeOS.Поэтому я попытался написать MIN(DateOS + TimeOS), а также создать новый столбец со значением DateOS + TimeOS, но оба возвращали пустую таблицу.Я не уверен, что сделал несколько ошибок, или это неправильный подход.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я добавил функцию DISTICT в код @Gordon Linoff, чтобы убрать дублирующиеся строки с одинаковыми датой и временем.

SELECT DISTINCT t.*
FROM[SIMASSIST].[dbo].[TestDupl] AS t
WHERE
NOT EXISTS
(
    SELECT 1
    FROM[SIMASSIST].[dbo].[TestDupl] AS t2
    WHERE t2.EP = t.EP AND t2.ID = t.ID AND
    (
        (t2.DateOS < t.DateOS OR t2.DateOS = t.DateOS) AND 
        (t2.TimeOS < t.TimeOS)
    )
)
0 голосов
/ 25 сентября 2018

Один из способов справиться с этим - проверить, не существует ли записей до данной записи.При этом используется NOT EXISTS.

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

SELECT pt.*
FROM [test07_dupl2] AS pt 
WHERE NOT EXISTS (SELECT 1
                  FROM [test07_dupl2] AS pt2
                  WHERE pt2.EP = pt.EP AND pt2.ID = pt.ID AND
                        (pt2.DateOS < pt.DateOS OR
                         pt2.DateOS = pt.DateOS AND pt2.TimeOS < pt.TimeOS
                        )
                 );

Для последней, конечное условие будет:

                        (pt2.DateOS > pt.DateOS OR
                         pt2.DateOS = pt.DateOS AND pt2.TimeOS > pt.TimeOS
                        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...