MS Access / T-SQL - группировка интервальных данных - PullRequest
0 голосов
/ 20 мая 2018

У меня есть несколько записей в CSV-файле, которые загружаются в таблицу MS SQL Server 2016 через базу данных MS Access.Я хотел бы сгруппировать эти записи, используя запрос VBA или запрос T-SQL (вместо кода VBA, использующего наборы записей), прежде чем они будут вставлены в таблицу базы данных SQL.

Пример ввода:

ShiftID    Name_ID          From    To  Length  Size    Chargeable**
----------------------------------------------------------------------------
DAY1       CLASSIC_1        0.0     2.8  2.8    NQ2     Yes
DAY1       CLASSIC_1        2.8     5.8  3      NQ2     No
DAY1       CLASSIC_1        5.8     8.0  2.2    NQ2     No
DAY1       CLASSIC_1        8.0     11.1 3.1    NQ2     Yes
DAY1       CLASSIC_1        11.1    14.3 3.2    NQ2     Yes

Обязательный вывод:

ShiftID    Name_ID          From    To  Length  Size    Chargeable
----------------------------------------------------------------------
DAY1       CLASSIC_1        0.0     2.8  2.8     NQ2    Yes
DAY1       CLASSIC_1        2.8     8.0  5.2     NQ2    No
DAY1       CLASSIC_1        8.0    14.3  6.3     NQ2    Yes

Использование запроса:

SELECT ShiftID, Name_ID, Min([From]) AS [From], Max([To]) AS [To], Sum(Length) AS Length, 
Size, Chargeable FROM table1
 GROUP BY ShiftID, Name_ID, Size, Chargeable
 ORDER BY ShiftID, Name_ID, Min([From]), Max([To]), Size, Chargeable;

возвращает следующие записи:

ShiftID Name_ID     From    To   Length  Size   Chargeable
----------------------------------------------------------------
DAY1    CLASSIC_1   0.0     14.3  9.1    NQ2    Yes
DAY1    CLASSIC_1   2.8     8.0   5.2    NQ2    No

, что я быожидаю, но не то, что мне нужно.Группировка в этом случае не дает мне правильную глубину To .Правильный запрос не должен возвращать перекрывающиеся интервалы.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

В Доступ к SQL это можно сделать с помощью подзапросов:

SELECT 
    MeasureLevel.ShiftID,
    MeasureLevel.Name_ID,
    Min(MeasureLevel.From) AS [From], 
    Max(MeasureLevel.To) AS [To], 
    Sum(MeasureLevel.Length) AS Length, 
    MeasureLevel.Size,
    MeasureLevel.Chargeable
FROM
    (SELECT 
        Measure.ShiftID,
        Measure.Name_ID,
        Measure.From, 
        Measure.To, 
        Measure.Length, 
        Measure.Size,
        Measure.Chargeable, 
        (Select 
            Max(T.From) 
        From 
            Measure As T 
        Where 
            T.From <= Measure.To And 
            T.Chargeable = Measure.Chargeable) AS [Level]
    FROM 
        Measure) As MeasureLevel
GROUP BY 
    MeasureLevel.ShiftID,
    MeasureLevel.Name_ID,
    MeasureLevel.Level, 
    MeasureLevel.Size,
    MeasureLevel.Chargeable
0 голосов
/ 20 мая 2018

Это проблема пробелов и островков .Используя следующий запрос T-SQL:

SELECT ShiftID, Name_ID, [From], [To], Length, Size, Chargeable,
       ROW_NUMBER() OVER (PARTITION BY ShiftID, Name_ID, Size 
                          ORDER BY [From]) - 
       ROW_NUMBER() OVER (PARTITION BY ShiftID, Name_ID, Size, Chargeable
                          ORDER BY [From]) AS grp
FROM Table1

производит следующий вывод:

ShiftID Name_ID     From  To    Length  Size    Chargeable  grp
---------------------------------------------------------------
DAY1    CLASSIC_1   3     5     3       NQ2     No          1
DAY1    CLASSIC_1   6     8     2       NQ2     No          1
DAY1    CLASSIC_1   0     2     3       NQ2     Yes         0
DAY1    CLASSIC_1   8     11    3       NQ2     Yes         2
DAY1    CLASSIC_1   11    14    3       NQ2     Yes         2

Теперь вы можете использовать grp для консолидации записей:

SELECT ShiftID, Name_ID, Size, 
       MIN([From]) AS [From], MAX([To]) AS [To], SUM(Length) AS Length,
       Chargeable
FROM (
    SELECT ShiftID, Name_ID, [From], [To], Length, Size, Chargeable,
           ROW_NUMBER() OVER (PARTITION BY ShiftID, Name_ID, Size 
                              ORDER BY [From]) - 
           ROW_NUMBER() OVER (PARTITION BY ShiftID, Name_ID, Size, Chargeable 
                              ORDER BY [From]) AS grp
    FROM Table1) AS t
GROUP BY ShiftID, Name_ID, Size, Chargeable, grp

Демо здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...