首页 > 解决方案 > 当列上存在日期时间时获取唯一行

问题描述

您好,我有一张桌子,每次我数一块时我都会在其中插入。使用一个订单,在同一天可能会有多个订单。在该表中,我将插入当前班次。我想要做的是获得每个班次的第一行,如果在那个班次中超过 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

换句话说,我想从每个班次中获得第一行

标签: sqlsql-servertsqlsql-server-2012greatest-n-per-group

解决方案


有很多方法可以解决这个前 1 个每组问题。

一种解决方案是使用相关子查询进行过滤:

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

这为您提供了每天和班次的最早记录。

如果您想在所有天中每个班次的第一条记录,您可以稍微修改查询:

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

我也喜欢反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

推荐阅读