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