Sql 24小时内求和值,不重复

Sql 24小时内求和值,不重复,sql,sql-server,Sql,Sql Server,我有一个3列的数据集-名称、日期时间、值 例如: Name DateTime value ---------------------------- A 1/1/2011 1:00:00 626 A 1/1/2011 2:00:00 2311 B 1/1/2011 3:00:00 775 A 1/1/2011 4:00:00 6621 A 1/1/2011 5:00:00 8491 B 1/1/2011 6:00:00

我有一个3列的数据集-名称、日期时间、值

例如:

Name DateTime         value 
----------------------------
 A   1/1/2011 1:00:00   626
 A   1/1/2011 2:00:00  2311 
 B   1/1/2011 3:00:00   775 
 A   1/1/2011 4:00:00  6621 
 A   1/1/2011 5:00:00  8491 
 B   1/1/2011 6:00:00  9061 
 B   1/1/2011 7:00:00  3611 
 B   1/2/2011 4:00:00  5491 
 A   1/2/2011 5:00:00    21 
我想对按名称和24小时分组的值求和,但不重复(如果我使用了一行,我不想重复使用)

期望值:

Name Value 
A    2368 
B    2042 
B     549 
A       2
我使用了
while
循环,用唯一索引标记24小时内发生的事件,它可以工作,但需要永远运行,因为我有大数据表

请尝试这种方法

select Name,SUM(Value) from Tblname group by Name,CONVERT(date,[Datetime],106) 
这样试试

select Name,SUM(Value) from Tblname group by Name,CONVERT(date,[Datetime],106) 
这样试试

select Name,SUM(Value) from Tblname group by Name,CONVERT(date,[Datetime],106) 
这样试试

select Name,SUM(Value) from Tblname group by Name,CONVERT(date,[Datetime],106) 
原件:

SELECT
      name
    , CAST([DateTime] AS date) AS [Date]
    , SUM(value)
FROM YourTable
WHERE [DateTime] >= '20110101'
      AND [DateTime] < '20120101'
GROUP BY
      name
    , CAST([DateTime] AS date)
原件:

SELECT
      name
    , CAST([DateTime] AS date) AS [Date]
    , SUM(value)
FROM YourTable
WHERE [DateTime] >= '20110101'
      AND [DateTime] < '20120101'
GROUP BY
      name
    , CAST([DateTime] AS date)
原件:

SELECT
      name
    , CAST([DateTime] AS date) AS [Date]
    , SUM(value)
FROM YourTable
WHERE [DateTime] >= '20110101'
      AND [DateTime] < '20120101'
GROUP BY
      name
    , CAST([DateTime] AS date)
原件:

SELECT
      name
    , CAST([DateTime] AS date) AS [Date]
    , SUM(value)
FROM YourTable
WHERE [DateTime] >= '20110101'
      AND [DateTime] < '20120101'
GROUP BY
      name
    , CAST([DateTime] AS date)

我找到了一个解决方案:在24小时内找到每个名字的最大值,然后检查哪一个日期是第一个日期,并包括其中当前出现的日期

SET NOCOUNT ON;

CREATE TABLE #Temp
(
    Name varchar(128)
       ,[Date]     DATETIME
    ,[Value]   INT
);

INSERT INTO #Temp
SELECT 'A','2011-01-01 1:00:00',626
UNION ALL SELECT 'A','2011-01-01 2:00:00',231 
UNION ALL SELECT 'B','2011-01-01 3:00:00',775 
UNION ALL SELECT 'A','2011-01-01 4:00:00',662 
UNION ALL SELECT 'A','2011-01-01 5:00:00',849 
UNION ALL SELECT 'B','2011-01-01 6:00:00',906 
UNION ALL SELECT 'B','2011-01-01 7:00:00',361 
 UNION ALL SELECT 'B','2011-01-02 4:00:00',549
UNION ALL SELECT 'A','2011-01-02 5:00:00',2
  UNION ALL SELECT 'A','2011-01-03 4:00:00',1


SELECT * FROM #Temp
order by [Date];


select Name,[Date],[Value],(select max([Date]) from #temp t2
                                 where t2.Name=t1.Name and t2.[Date] between t1.[Date] and dateadd(hour,24,t1.[Date])) MaxVal
into #temp2
from #temp t1

select *,(select min(date) from #temp2 t2 where t1.[Date] between t2.[Date] and t2.MaxVal and t1.Name=t2.Name ) MinOfMax
into #temp3
from #temp2 t1


select Name,sum(value)
from #temp3
group by  Name,MinOfMax

我找到了一个解决方案:在24小时内找到每个名字的最大值,然后检查哪一个日期是第一个日期,并包括其中当前出现的日期

SET NOCOUNT ON;

CREATE TABLE #Temp
(
    Name varchar(128)
       ,[Date]     DATETIME
    ,[Value]   INT
);

INSERT INTO #Temp
SELECT 'A','2011-01-01 1:00:00',626
UNION ALL SELECT 'A','2011-01-01 2:00:00',231 
UNION ALL SELECT 'B','2011-01-01 3:00:00',775 
UNION ALL SELECT 'A','2011-01-01 4:00:00',662 
UNION ALL SELECT 'A','2011-01-01 5:00:00',849 
UNION ALL SELECT 'B','2011-01-01 6:00:00',906 
UNION ALL SELECT 'B','2011-01-01 7:00:00',361 
 UNION ALL SELECT 'B','2011-01-02 4:00:00',549
UNION ALL SELECT 'A','2011-01-02 5:00:00',2
  UNION ALL SELECT 'A','2011-01-03 4:00:00',1


SELECT * FROM #Temp
order by [Date];


select Name,[Date],[Value],(select max([Date]) from #temp t2
                                 where t2.Name=t1.Name and t2.[Date] between t1.[Date] and dateadd(hour,24,t1.[Date])) MaxVal
into #temp2
from #temp t1

select *,(select min(date) from #temp2 t2 where t1.[Date] between t2.[Date] and t2.MaxVal and t1.Name=t2.Name ) MinOfMax
into #temp3
from #temp2 t1


select Name,sum(value)
from #temp3
group by  Name,MinOfMax

我找到了一个解决方案:在24小时内找到每个名字的最大值,然后检查哪一个日期是第一个日期,并包括其中当前出现的日期

SET NOCOUNT ON;

CREATE TABLE #Temp
(
    Name varchar(128)
       ,[Date]     DATETIME
    ,[Value]   INT
);

INSERT INTO #Temp
SELECT 'A','2011-01-01 1:00:00',626
UNION ALL SELECT 'A','2011-01-01 2:00:00',231 
UNION ALL SELECT 'B','2011-01-01 3:00:00',775 
UNION ALL SELECT 'A','2011-01-01 4:00:00',662 
UNION ALL SELECT 'A','2011-01-01 5:00:00',849 
UNION ALL SELECT 'B','2011-01-01 6:00:00',906 
UNION ALL SELECT 'B','2011-01-01 7:00:00',361 
 UNION ALL SELECT 'B','2011-01-02 4:00:00',549
UNION ALL SELECT 'A','2011-01-02 5:00:00',2
  UNION ALL SELECT 'A','2011-01-03 4:00:00',1


SELECT * FROM #Temp
order by [Date];


select Name,[Date],[Value],(select max([Date]) from #temp t2
                                 where t2.Name=t1.Name and t2.[Date] between t1.[Date] and dateadd(hour,24,t1.[Date])) MaxVal
into #temp2
from #temp t1

select *,(select min(date) from #temp2 t2 where t1.[Date] between t2.[Date] and t2.MaxVal and t1.Name=t2.Name ) MinOfMax
into #temp3
from #temp2 t1


select Name,sum(value)
from #temp3
group by  Name,MinOfMax

我找到了一个解决方案:在24小时内找到每个名字的最大值,然后检查哪一个日期是第一个日期,并包括其中当前出现的日期

SET NOCOUNT ON;

CREATE TABLE #Temp
(
    Name varchar(128)
       ,[Date]     DATETIME
    ,[Value]   INT
);

INSERT INTO #Temp
SELECT 'A','2011-01-01 1:00:00',626
UNION ALL SELECT 'A','2011-01-01 2:00:00',231 
UNION ALL SELECT 'B','2011-01-01 3:00:00',775 
UNION ALL SELECT 'A','2011-01-01 4:00:00',662 
UNION ALL SELECT 'A','2011-01-01 5:00:00',849 
UNION ALL SELECT 'B','2011-01-01 6:00:00',906 
UNION ALL SELECT 'B','2011-01-01 7:00:00',361 
 UNION ALL SELECT 'B','2011-01-02 4:00:00',549
UNION ALL SELECT 'A','2011-01-02 5:00:00',2
  UNION ALL SELECT 'A','2011-01-03 4:00:00',1


SELECT * FROM #Temp
order by [Date];


select Name,[Date],[Value],(select max([Date]) from #temp t2
                                 where t2.Name=t1.Name and t2.[Date] between t1.[Date] and dateadd(hour,24,t1.[Date])) MaxVal
into #temp2
from #temp t1

select *,(select min(date) from #temp2 t2 where t1.[Date] between t2.[Date] and t2.MaxVal and t1.Name=t2.Name ) MinOfMax
into #temp3
from #temp2 t1


select Name,sum(value)
from #temp3
group by  Name,MinOfMax


24小时表示标准日历日?请不要使用数据图像,以可重复使用的形式(文本)提供数据无论如何也不要使用外部图像库。不是日历日而是24小时-因此,如果23:00有值,我希望它与我调整答案后的第二天1:00的值相加。24小时表示标准日历日?请不要使用数据图像,以可重复使用的形式提供数据(文本)无论如何也不要使用外部图像库。不是日历日而是24小时-因此,如果23:00有值,我希望它与我调整答案后的第二天1:00的值相加。24小时表示标准日历日?请不要使用数据图像,以可重复使用的形式提供数据(文本)无论如何也不要使用外部图像库。不是日历日而是24小时-因此,如果23:00有值,我希望它与我调整答案后的第二天1:00的值相加。24小时表示标准日历日?请不要使用数据图像,以可重复使用的形式提供数据(文本)并且无论如何都不要使用外部图像库。不是日历日而是24小时-因此,如果23:00有值,我希望在我调整答案以回应您上面的最新评论后的第二天1:00的值相加。您应该添加转换(日期,…)在SELECT.in此方法中,我按天而不是24日求和,如果我在数据中有另一行:A 2011年1月3日4:00:00,您将在A的输出中获得另一行,我希望将其求和为24小时显示的值ago@AvishyS当你更改日期时,它会更改为24小时,所以它会显示在下一行。实际上,它不起作用。我使用的是相同的数据如上所示,另一行为“A”,即“2011-01-03 4:00:00”,1-我预计会得到:A,2368;B,2042;A,3;B,549,但我得到了A,2368;B,2042;A,2;B,549;A,1以及您的解决方案您应该添加转换(日期,…)在SELECT.in此方法中,我按天而不是24日求和,如果我在数据中有另一行:A 2011年1月3日4:00:00,您将在A的输出中获得另一行,我希望将其求和为24小时显示的值ago@AvishyS当你更改日期时,它会更改为24小时,所以它会显示在下一行。实际上,它不起作用。我使用的是相同的数据如上所示,另一行为“A”,即“2011-01-03 4:00:00”,1-我预计会得到:A,2368;B,2042;A,3;B,549,但我得到了A,2368;B,2042;A,2;B,549;A,1以及您的解决方案您应该添加转换(日期,…)在SELECT.in此方法中,我按天而不是24日求和,如果我在数据中有另一行:A 2011年1月3日4:00:00,您将在A的输出中获得另一行,我希望将其求和为24小时显示的值ago@AvishyS当你更改日期时,它会更改为24小时,所以它会显示在下一行。实际上,它不起作用。我使用的是相同的数据如上所示,另一行为“A”,即“2011-01-03 4:00:00”,1-我预计会得到:A,2368;B,2042;A,3;B,549,但我得到了A,2368;B,2042;A,2;B,549;A,1以及您的解决方案您应该添加转换(日期,…)在SELECT.in此方法中,我按天而不是24日求和,如果我在数据中有另一行:A 2011年1月3日4:00:00,您将在A的输出中获得另一行,我希望将其求和为24小时显示的值ago@AvishyS当你更改日期时,它会更改为24小时,所以它会显示在下一行。实际上,它不起作用。我使用的是相同的上面的数据是另一行“A”,即“2011-01-03 4:00:00”,1-我希望得到:A,2368;B,2042;A,3;B,549,但我得到了A,2368;B,2042;A,2;B,549;A,1和您的解决方案