Sql server 在每组的一列中选择最小值
我有一个表,它看起来像是用下面的代码创建的Sql server 在每组的一列中选择最小值,sql-server,ms-access-2010,Sql Server,Ms Access 2010,我有一个表,它看起来像是用下面的代码创建的 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
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
我想添加到该代码中,该代码将选择每个主题ID的最小完成时间值。留下所需的表格:
ID Time_to_complete ... .....
1 5
2 6
3 7
4 14
我正在使用Access,并希望继续使用Access来完成此代码,但如果在Access中不可能,我可以选择使用SQL Server。谢谢 我怀疑您需要相关子查询:
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
是您的标识列,用于指定订单
表中的唯一条目,因此您可以相应地对其进行更改 看看这个:
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中,然后在此处应用该技术
这是一个值得熟悉的过程,因为它在很多地方都被使用,尤其是在重复数据消除方面。我不确定您是说要过滤数据,还是要在另一列中添加新值。无论哪种方式,在SQL Server中,这两种方法都是微不足道的;通过使用CTE/子查询和
行号
或分别使用MIN
和OVER
子句。关于如何做这两件事,有很多例子(我今天看到了至少3个关于前者的问题…),谢谢!另一个问题是,一些ID具有相同的最小值,因此在生成的表中有许多重复ID具有相同的最小值。例如,如果ID 5有7条记录,其中两条记录的完成时间变量为3,则表输出显示ID 5的三行。我可以向代码中添加什么以仅显示唯一值。我试图在select语句后添加“distinct”,但没有成功。@Greg。在这种情况下,您可以在子查询中使用top(1)
。
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