繁体   English   中英

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

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

我有一张用于生产Cookie的表格,其中为每个Cookie分配了一个盒号和一个从烤箱中出来的时间(一次从一个烤箱中出来的Cookie)。 用户退出烤箱后检查曲奇,并为每个曲奇分配一个盒号。 (箱号全天都在增加;每个箱仅一种cookie。)我想获得一份今天的箱号列表,按时间排序。 然而,在每一天的开始,前一天的最后一个箱子可能没有被完全填满,这样的日子可以用框56开始,而不是箱1.我不想的第一几块饼干框56中的“一天”,以使它与当天晚些时候来自潜在框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 

我猜想所有的Cookie都需要几个小时才能出来。 也许这个总的想法会解决。

如果箱子的总数大致上一致,并且装满箱子的时间大致相同,那么您应该可以将一天分为三部分:大数字是早晨,大数字是下午,其余全部。 适当调整数字。

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的意思是:当天晚些时候有没有一个编号较低的框? 如果是这样,则将该框单独分组。

更详细地讲,内部查询说:找到在此之后产生的所有cookie(不在同一盒子中)的最低盒子编号。 由于箱号是单调序列(值总是增加),因此,如果当天晚些时候有一个箱号,并且比当前箱号还低,那么该号码必须已重置并且当前箱号是前一天的保留时间。 编号上的间隙将无关紧要。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM