Получать уникальные строки, когда в столбцах есть дата и время - PullRequest
0 голосов
/ 18 января 2020

Здравствуйте, у меня есть таблица, куда я вставляю каждый раз, когда подсчитываю кусок. Используя заказ, в один и тот же день может быть более одного заказа. В эту таблицу я вставляю текущую смену. Я хочу получить первую строку каждой смены, и не имеет значения, если в этой смене более 1 порядка.

На данный момент это мой запрос:

SELECT DISTINCT Part [Model], Station , Operators, Workorder, ShiftId, 
min([Date]) [StartDate], CONVERT(date, min([Date])) [StartDateFormat] 
FROM  Orders
WHERE Station IN ('S1', 'S2')
group by Part, Station, Operators, Workorder, ShiftId
order by Station

Для полного примера, пожалуйста, отметьте это SQL Fiddle

Что я ожидаю, так как в результате я получу следующую таблицу:

Model  |  Station  | Operator  |  Workorder  |  ShiftId  |  StartDate            |  StartDateFormat  |
A1     |   S1      |   5       |  45010001   |     1     | 2020-01-17T10:24:08Z  |   2020-01-17      |   
A1     |   S1      |   5       |  45010022   |     2     | 2020-01-17T11:35:08Z  |   2020-01-17      |
A1     |   S1      |   15      |  45010004   |     3     | 2020-01-18T19:35:08Z  |   2020-01-18      |
Rows for Station S2 Are OK

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

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Если я правильно понял, вам нужно что-то вроде этого:

SELECT  *
FROM    (
            SELECT  PART [MODEL],
                    STATION,
                    OPERATORS,
                    WORKORDER,
                    SHIFTID, 
                    [DATE]  AS  [STARTDATE],
                    CONVERT(DATE, [DATE]) AS [STARTDATEFORMAT],
                    ROW_NUMBER() OVER(PARTITION BY CONVERT(DATE, [DATE]), SHIFTID ORDER BY [DATE])  AS  RN
            FROM    ORDERS
            WHERE STATION IN ('S1', 'S2')
        ) V1
WHERE   V1.RN = 1

SQL Fiddle

0 голосов
/ 18 января 2020

Существует много способов решения этой первой проблемы для каждой группы.

Одним из решений является фильтрация с помощью коррелированного подзапроса:

select o.*
from orders o
where o.date = (
    select min(o1.date) 
    from orders o1
    where o1.shiftId = o.shiftId and cast(o1.date as date) = cast(o.date as date) 
)
order by o.date

Это дает вам самую раннюю запись в день и shift.

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

select o.*
from orders o
where o.date = (
    select min(o1.date) 
    from orders o1
    where o1.shiftId = o.shiftId 
)
order by o.date

Мне также нравится метод anti- left join:

select o.*
from orders o
left join orders o1 
    on  o1.shiftId = o.shiftId 
    and cast(o1.date as date) = cast(o.date as date)
where o1.id is null
order by o.date
...