Выбор наименьшего значения в одном столбце на группу - PullRequest
0 голосов
/ 22 января 2019

У меня есть таблица, которая выглядит следующим образом, которая была создана с использованием следующего кода ...

SELECT Orders.ID, Orders.CHECKIN_DT_TM, Orders.CATALOG_TYPE, 
Orders.ORDER_STATUS, Orders.ORDERED_DT_TM, Orders.COMPLETED_DT_TM, 
Min(DateDiff("n",Orders.ORDERED_DT_TM,Orders.COMPLETED_DT_TM)) AS 
Time_to_complete

FROM Orders

GROUP BY Orders.ORDER_ID, Orders.ID,
Orders.CHECKIN_DT_TM, Orders.CATALOG_TYPE, Orders.ORDERED_DT_TM, 
Orders.COMPLETED_DT_TM, HAVING (((Orders.CATALOG_TYPE)="radiology");

ID  Time_to_complete ... .....
1        5
1        7
1        8
2        23
2        6
3        7
4        16
4        14

Я хотел бы добавить к этому коду, который бы выбирал наименьшее значение Time_to_complete для каждого идентификатора субъекта. Покидая нужный стол:

ID  Time_to_complete ... .....
1        5
2        6
3        7
4        14

Я использую Access и предпочитаю продолжать использовать Access для завершения этого кода, но у меня есть возможность использовать SQL Server, если это невозможно в Access. Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Посмотрите на это:

DECLARE @myTable AS TABLE (ID INT, Time_to_complete INT);

INSERT INTO @myTable
VALUES (1, 5)
,      (1, 7)
,      (1, 8)
,      (2, 23)
,      (2, 6)
,      (3, 7)
,      (4, 16)
,      (4, 14);

WITH cte AS
    (SELECT *
     ,      ROW_NUMBER() OVER (PARTITION BY ID  ORDER BY Time_to_complete) AS RN
       FROM @myTable)
SELECT  cte.ID
,       cte.Time_to_complete
  FROM  cte
 WHERE  RN = 1;

Результаты:

ID          Time_to_complete
----------- ----------------
1           5
2           6
3           7
4           14

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

Стоит ознакомиться с этим процессом, поскольку он используется во многих местах - особенно в отношении дедупликации данных.

0 голосов
/ 22 января 2019
Try This 

    DECLARE @myTable AS TABLE (ID INT, Time_to_complete INT);

    INSERT INTO @myTable
    VALUES (1, 5)
    ,      (1, 7)
    ,      (1, 8)
    ,      (2, 23)
    ,      (2, 6)
    ,      (3, 7)
    ,      (4, 16)
    ,      (4, 14);


    SELECT  O.ID, O.Time_to_complete 
    FROM @myTable O
    WHERE o.Time_to_complete  = (Select min(m.Time_to_complete) FROM @myTable m
                                                        Where o.id=m.ID
                                                              );


Result :

ID  Time_to_complete
1   5
2   6
3   7
4   14
0 голосов
/ 22 января 2019

Я подозреваю, что вам нужно коррелированный подзапрос:

SELECT O.*, DateDiff("n", O.ORDERED_DT_TM, O.COMPLETED_DT_TM) AS Time_to_complete
FROM Orders O
WHERE DateDiff("n", O.ORDERED_DT_TM, O.COMPLETED_DT_TM) = (SELECT Min(DateDiff("n", O1.ORDERED_DT_TM, O1.COMPLETED_DT_TM))     
                                                           FROM Orders O1
                                                           WHERE O1.ORDER_ID = O.ORDER_ID AND . . . 
                                                          );

РЕДАКТИРОВАТЬ: Если вы хотите уникальные записи, вы можете сделать вместо этого:

SELECT O.*, DateDiff("n", O.ORDERED_DT_TM, O.COMPLETED_DT_TM) AS Time_to_complete
FROM Orders O
WHERE o.pk = (SELECT TOP (1) o1.pk  
              FROM Orders O1
              WHERE O1.ORDER_ID = O.ORDER_ID AND . . . 
              ORDER BY DateDiff("n", O.ORDERED_DT_TM, O.COMPLETED_DT_TM) ASC
             );

pk - это столбец идентификаторов, в котором указана уникальная запись в таблице Orders, поэтому вы можете изменить ее соответствующим образом.

...