Изменять консультацию SQL, чтобы получать ожидаемые результаты

Transfondo

Я произвожу серию докладов начиная с информации, содержавшей в базе данных в SQL Server.

Для эффектов вопроса, я позвоню в эту базу данных: Попытайся.

Базы данных Попытайся я получаю час, в котором некие пользователи использовали устройство Пример: ПК.

Стоимость даты находится в формате UNIX я украл, и который, благодаря этому ответу я смог приспосабливать в этом вопросе, чтобы улучшать понимание данных.


Недостаток

Выполнив следующую консультацию, которую он считает рангом даты:

05.09.2016 0:00:00 - 05.09.2016 23:59:59

-- Variables globales.
DECLARE @dt DATETIME = '1970-01-01' -- epoch start

SELECT ID, 
       (CASE Lector
        WHEN 539560940 THEN FORMAT(DATEADD(SECOND, Fecha, @dt),'HH:mm')
        ELSE '0' END) AS 'Hora entrada',
       (CASE Lector
        WHEN 539560944 THEN FORMAT(DATEADD(SECOND, Fecha, @dt),'HH:mm')
        ELSE '0' END) AS 'Hora salida',        
       (CASE Lector
        WHEN 539560940 THEN 'Entrada'
        WHEN 539560944 THEN 'Salida'
        ELSE '0' END) AS Lector,
       Evento,
       UsuarioID
FROM LogEventos
WHERE UsuarioID = 52698067
AND Fecha >= 1473033600 AND Fecha <= 1473119999
AND Evento = 55
ORDER BY Fecha

Я получаю колонны введенный Час и Час, вышедший в различных линиях:

---------------------------------------------
|   Hora de entrada     |   Hora de salida  |
---------------------------------------------
|       07:54           |          0        |
---------------------------------------------
|         0             |       09:01       |
---------------------------------------------
|       09:04           |          0        |
---------------------------------------------
|         0             |       10:21       |
---------------------------------------------
|       10:25           |          0        |
---------------------------------------------
|          0            |       12:27       |
---------------------------------------------
|       15:00           |          0        |
---------------------------------------------
|          0            |       16:28       |
---------------------------------------------
|       16:33           |          0        |
---------------------------------------------
|          0            |       18:51       |
---------------------------------------------

Нажми на изображение, чтобы расширять ее Resultados consulta 1

Когда то, что я хочу получить, это следующие результаты:

---------------------------------------------
|   Hora de entrada     |   Hora de salida  |
---------------------------------------------
|       07:54           |       09:01       |
---------------------------------------------
|       09:04           |       10:21       |
---------------------------------------------
|       10:25           |       12:27       |
---------------------------------------------
|       15:00           |       16:28       |
---------------------------------------------
|       16:33           |       18:51       |
---------------------------------------------

Как я могу изменять консультацию, чтобы получать ожидаемую стоимость?


Я произвел в следующем sqlfiddle структуру с данными об образце, которые соответствуют базе данных.

1
задан 23.05.2017, 15:39
2 ответа

Ok, что ты нуждаешься в том, чтобы сделать, один JOIN между subset линий, которые представляют поступающие данные, с subset линий, которые представляют выводы. Кроме того, у тебя должна быть колонна, которая идентифицировала бы хронологический порядок каждой из этих линий, чтобы мочь делать JOIN (это согласно твоему комментарию, идеальное состояло бы в том, чтобы был прямой способ связывать поступающие данные с выводами).

Ты можешь тестировать этот код:

DECLARE @dt DATETIME = '19700101';

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY UsuarioID, Evento
                                   ORDER BY Fecha)
    FROM LogEventos
)
SELECT  Ent.ID,
        FORMAT(DATEADD(SECOND, Ent.Fecha, @dt),'HH:mm') [Hora entrada],
        FORMAT(DATEADD(SECOND, Sal.Fecha, @dt),'HH:mm') [Hora salida],
        Ent.Evento,
        Ent.UsuarioID

FROM (  SELECT *
        FROM CTE
        WHERE Lector = 539560940) Ent
LEFT JOIN ( SELECT *
            FROM CTE
            WHERE Lector = 539560944) Sal
    ON Ent.UsuarioID = Sal.UsuarioID
    AND Ent.Evento = Sal.Evento
    AND Ent.RN = Sal.RN - 1;
2
ответ дан 24.11.2019, 13:15

Реши это с join, отдели консультации, чтобы получать час ввода и час вывода.

DeberГ, - Чтобы быть очень простым, уже у тебя есть данные.

-1
ответ дан 24.11.2019, 13:15
  • 1
    Пожалуйста разработай лучше твой ответ. – Mauricio Arias Olave 30.09.2016, 16:10