【发布时间】:2010-03-11 08:06:31
【问题描述】:
我有一个棘手的问题让我摸不着头脑。我有一些数据表示“小部件”在可变天数内的交付,分为半小时时段。
例如(为格式化道歉 - 还没有完全掌握它):
Date Time NoOfUnits
01-Mar-2010 00:00 0
01-Mar-2010 00:30 0
01-Mar-2010 01:00 0
.... (following half hour intervals have NoOfUnits = 0)
01-Mar-2010 23:00 10
01-Mar-2010 23:30 10
02-Mar-2010 00:00 10
.... (following half hour intervals have NoOfUnits = 1)
02-Mar-2010 07:00 10
02-Mar-2010 07:30 0
.... (following half hour intervals have NoOfUnits = 0)
02-Mar-2010 23:30 0
我需要生成一个查询,以便我将这些数据分组到我正在交付一个单元的所有不同块中。在上面的示例中,我只需要识别 1 个块 - 23:00 到 07:00,以及该块的单位总和 (160)。因此,所需的结果将是 StartTime、EndTime、TotalNoOfUnits。
但是,当我们有不同的交付模式时,复杂性就来了 - 也许我们有一天 24 小时交付单元。
我需要能够以上述格式查询数据并识别所有唯一的 StartTime、EndTime 和 TotalNoOfUnits 组合,其中 NoOfUnits 0。
再次为格式化和一个有点漫不经心的问题道歉。请提出您需要我澄清的任何问题。
编辑:为了清楚起见,数据将始终从每天 00:00 到 23:30 运行,并且始终存在每个半小时时段。对于任何给定的数据集,只有每半小时时段的天数和单位可能会有所不同。
EDIT2:下面是一个脚本,它将用 2 天的计划数据填充一个表。这两天的日程安排是一样的。根据我的要求,我希望看到的结果是 13:00, 00:00, 230。正如您从下面看到的那样,我的 SQL 技能不是很好,因此很头疼!
declare @DayCount int
declare @HalfHourCount int
declare @HH int
declare @CurrentDate datetime
declare @BaseDate datetime
declare @NoOfUnits int
set @HalfHourCount = 48
set @DayCount = 4
set @BaseDate = '1 Jan 1900'
create table #Schedule
(
Date datetime
, Time datetime
, NoOfUnits int
)
while @DayCount > 0
begin
set @CurrentDate = dateadd(dd, @DayCount * -1, CONVERT(VARCHAR(10),GETDATE(),111))
set @HH = @HalfHourCount
while @HH > 0
begin
if @HH > 24
set @NoOfUnits = 10
else
begin
if @DayCount = 4 and @HH < 10
set @NoOfUnits = 10
else
set @NoOfUnits = 0
end
insert into #Schedule(Date, Time, NoOfUnits)
values (@CurrentDate, dateadd(mi, @HH / 2.0 * 60, @BaseDate), @NoOfUnits)
select @HH = @HH - 1
end
set @DayCount = @DayCount - 1
end
预期结果(虽然测试数据应该从 00:00 开始到 23:00,而不是 00:30 到 00:00):
StartTime TotalUnits EndDate
----------------------- ----------- -----------------------
1900-01-01 00:30:00.000 90 1900-01-01 04:30:00.000
1900-01-01 12:30:00.000 960 1900-01-02 00:00:00.000
【问题讨论】:
-
好吧,对于初学者来说,当您的示例仅显示 40 个 NoOfUnits 时,单位数的总和怎么可能是 160?我假设您没有展示所有内容,但这将我们带到了问题的症结所在。很多人会因此而被推迟,试图给你一个答案。如果您想获得尽可能多的帮助,请包含一个 working 脚本来创建一个虚拟表、预期输出和最接近预期结果的查询(但还不是: )
-
+1 因为我相信你已经付出了很大的努力。作为 SO 的新用户,欢迎您。
-
谢谢利文。我会看看我是否可以敲出一个脚本来生成一些虚拟数据。我已经编辑了关于数量的问题。
-
@Lieven,它是 160,而不是 40...为了简洁起见,他省略了 00:30 到 07:00 之间的 30 分钟时段,即 6.5 小时(13 个半小时时段)。我认为还有一个错字......“(以下半小时间隔有 NoOfUnits = 1)”应该阅读:(以下半小时间隔有 NoOfUnits = 10)。虽然我不知道答案!
-
@DavidMasters84 - 你是对的,我的错。
标签: sql sql-server sql-server-2005