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
我有一个 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