SQL 查询按一列分组(可能有重复项)并按时间排序

SQL query to group by one column (with potential duplicates) and also order by time

我有一个 table 用于饼干生产,其中每个饼干都分配有一个盒子编号和一个时间从烤箱中出来(饼干一次一个地从烤箱中出来)。用户在离开烤箱后检查饼干并为每个饼干分配一个盒子编号。 (盒号在一天中只是递增;每个盒只有一种饼干。)我想要一份今天的盒号列表,按时间排序。然而,在每一天的开始,前一天的最后一个盒子可能还没有完全填满,所以这一天可能会从 e.g. 盒子 56 而不是盒子 1 开始。我不希望框 56 中当天的前几个 cookie 与当天晚些时候来自潜在框 56 的 cookie 错误关联。到目前为止我有

SELECT BoxNo, MAX(CookieType) AS CookieType
FROM Cookies
WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
GROUP BY BoxNo
ORDER BY MIN(TimeOutOfOven)

当然这并不能解决离散时间同框号的问题。

SELECT BoxNo, CookieType, TimeOutOfOven
     , LAG(BoxNo, 1, 0) OVER (ORDER BY TimeOutOfOven) AS PriorBox
 FROM cookie 
WHERE PriorBox <> BoxNo 
  and TimeOutOfOven >= CONVERT(date, GETDATE())

WITH CookiePlus
AS
(
  SELECT * 
       , ROW_NUMBER() OVER (ORDER BY TimeOutOfOven) rn
    FROM Cookie
   WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
) 
select cp1.* 
  from CookiePlus cp1 
  left join CookiePlus cp2 
    on cp2.rn = cp1.rn + 1 
 where cp2.boxID <> cp1.boxID 
    or cp2.rn is null 

我猜所有的饼干都需要几个小时才能出来。也许这个总体思路会奏效。

如果箱子的总数大致一致并且填满一个箱子的时间也大致相同,那么您应该可以将一天分成三部分:大数字是早上,大数字是在晚上下午,全部休息。适当调整数字。

SELECT BoxNo, MAX(CookieType) AS CookieType
FROM Cookies
WHERE TimeOutOfOven >= CONVERT(date, GETDATE())
GROUP BY
    BoxNo,
    CASE
        WHEN BoxNo > 30 AND HOUR(TimeOutOfOven) <  12 THEN 1
        WHEN BoxNo > 30 AND HOUR(TimeOutOfOven) >= 12 THEN 3
        ELSE 2
    END

SplitFlag 的意思是:当天晚些时候是否有一个编号较小的盒子?如果是这样,则将该框单独分组。

更详细地说,内部查询说:找到在这个之后产生的所有饼干(不在同一个盒子里)的最小盒子编号。由于方框编号是单调序列(值总是递增),如果当天晚些时候有一个并且也低于当前方框编号,则数字必须已重置并且当前数字是前一天的保留值。编号中的间隙无关紧要。

select BoxNo, max(CookieType) as CookieType, SplitFlag
from (
    select
        BoxNo, CookieType,
        case when (
            select min(BoxNo)
            from Cookes as c2
            where c2.TimeOutOfOven > c.TimeOutofOven and c2.BoxNo <> c.BoxNo
        ) < BoxNo then 1 else 0 end as SplitFlag
    from Cookies as c
    where TimeOutOfOven >= convert(date, getdate())
) as T
group by BoxNo, SplitFlag
order by SplitFlag desc, BoxNo

http://sqlfiddle.com/#!6/20637/1