100000条记录的表按天筛选成子表

大熊猫侯佩
iOS开发领域优质创作者
博客专家认证
2019-02-25 10:24:08
表的字段很简单,如下:

createDate : 日期类型,表示该条记录插入时的时间(一天中可能插入多条记录)
title : String类型,表示该条记录的标题
count : 整数类型,表示该条记录对应的数量

以上表中含有10w+的记录,包含1年中插入的所有记录(某一天可能没有任何记录,也可能有任意条记录)

现在想实现的是:

怎么将如上表中所有记录划分为若干个"集合",每个"集合"的内容是某一天中所有的记录?

我不知道这个"集合"应该表示成子表,数组,或是其他什么东东,请赐教.

谢谢!
...全文
1345 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2019-02-27
  • 打赏
  • 举报
回复
引用 41 楼 qq_41327902 的回复:
有一种方法,分组连接字符串,可以根据时间分组,同一组的title连接起来,中间用 ,隔开,这样结果就是类似这样
20190221 title1,title2
20190222 title3,title4
这样你的需求能满足吗



我要的是记录集合,你这样的话我还得重新再创建一遍,速度估计够呛。

不过,感谢回答!
田旭晨 2019-02-26
  • 打赏
  • 举报
回复
厉害,虽然不是很懂啊
qq_41327902 2019-02-26
  • 打赏
  • 举报
回复
有一种方法,分组连接字符串,可以根据时间分组,同一组的title连接起来,中间用 ,隔开,这样结果就是类似这样
20190221 title1,title2
20190222 title3,title4
这样你的需求能满足吗
大熊猫侯佩 2019-02-26
  • 打赏
  • 举报
回复
引用 39 楼 nayi_224 的回复:
不是很懂sqlserver,也许你要的是这种?

https://stackoverflow.com/questions/15477743/listagg-in-sqlserver




这不是我要的效果!但还是谢谢你帮我在SOF上搜索。

nayi_224 2019-02-26
  • 打赏
  • 举报
回复
不是很懂sqlserver,也许你要的是这种? https://stackoverflow.com/questions/15477743/listagg-in-sqlserver
吉普赛的歌 2019-02-25
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL
DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
createDate DATETIME
,[title] NVARCHAR(20)
,[count] INT
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'2019-01-01 10:20:15',N'xxx',10)
INSERT INTO dbo.[t] VALUES(N'2019-01-01 12:50:10',N'xxx',20)
INSERT INTO dbo.[t] VALUES(N'2019-01-01 23:20:19',N'xxx',30)
INSERT INTO dbo.[t] VALUES(N'2019-01-02 10:20:15',N'xxx',40)
INSERT INTO dbo.[t] VALUES(N'2019-01-05 08:20:15',N'xxx',50)
INSERT INTO dbo.[t] VALUES(N'2019-01-05 22:20:15',N'xxx',60)
INSERT INTO dbo.[t] VALUES(N'2019-02-10 10:20:15',N'xxx',70)
INSERT INTO dbo.[t] VALUES(N'2019-02-10 11:20:15',N'xxx',80)
INSERT INTO dbo.[t] VALUES(N'2019-02-10 15:20:15',N'xxx',90)
INSERT INTO dbo.[t] VALUES(N'2019-02-15 10:20:15',N'xxx',100)
GO
--
IF OBJECT_ID('dbo.Proc_QueryEveryDay') IS NOT NULL
DROP PROC dbo.Proc_QueryEveryDay
GO
-- =============================================
-- Author: yenange
-- Create date: 2019-02-25
-- Description: 根据参数,输出每天的记录
-- =============================================
CREATE PROCEDURE dbo.Proc_QueryEveryDay
@beginT DATE,
@endT DATE
AS
BEGIN
SET NOCOUNT ON;
WHILE @beginT<dateadd(DAY,1,@endT)
BEGIN
IF EXISTS(SELECT * FROM t WHERE createDate>=@beginT AND createDate<DATEADD(DAY,1,@beginT))
BEGIN
SELECT * FROM t WHERE createDate>=@beginT AND createDate<DATEADD(DAY,1,@beginT);
END
SET @beginT=DATEADD(DAY,1,@beginT);
END
END
GO

--查询
EXEC dbo.Proc_QueryEveryDay @beginT='2019-01-01',@endT='2019-02-10'


吉普赛的歌 2019-02-25
  • 打赏
  • 举报
回复
10万条记录不算很多, 可以一次性查询。 SqlServer 用存储过程来完成,C#这边用 DataSet 接收就可以了, 因为只有 DataSet 才有子表的概念。 至于效率, 和 #21 版主的差不多, 因为都是一次性查询, 只不过筛选一个在sqlserver一个在C#。 所以, 如果你做好了的话就不用折腾了, 没做好可以用我说的试试。
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
只是探讨一下可能性,呵呵
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
引用 21 楼 唐诗三百首 的回复:
举个例子, C#实现,

...

这样在Dictionary里, 每个key(日期)对应一个FData的list.



你说的没错!!!
我现在代码差不多就是这样实现的!

我只想知道:

用数据库查询语句是否可以实现类似功能?
如果可以,会比用代码快很多么?
唐诗三百首 2019-02-25
  • 打赏
  • 举报
回复
举个例子, C#实现,

public class FData
{
public DateTime createDate;
public string title;
public int count;

public FData(DateTime pcreateDate, string ptitle, int pcount)
{
createDate = pcreateDate;
title = ptitle;
count = pcount;
}
}




DataTable dt;
Dictionary<DateTime, List<FData>> ls;
DateTime tcreateDate;
string ttitle;
int tcount;

dt = FQuery(); // 从数据库查询,返回Datatable对象, 例如执行select createDate,title,count from [表名] where [条件]
ls = new Dictionary<DateTime, List<FData>>();

foreach(DataRow dr in dt.Rows)
{
tcreateDate = Convert.ToDateTime(dr["createDate"]);
ttitle = dr["title"].ToString();
tcount = Convert.ToInt32(dr["count"]);

if (ls.ContainsKey(tcreateDate) == false)
{
ls.Add(tcreateDate, new List<FData>());
}

ls[tcreateDate].Add(new FData(tcreateDate, ttitle, tcount));
}

这样在Dictionary里, 每个key(日期)对应一个FData的list.
二月十六 2019-02-25
  • 打赏
  • 举报
回复
引用 19 楼 大熊猫侯佩 的回复:
[quote=引用 17 楼 二月十六 的回复:] 生成子表可以实现,但是我觉得这样做有问题,生成的表名称是什么,你的程序怎么知道的表名称,这些都是问题
比如以下2条记录 2019-01-01 20:50:20 和 2019-01-01 19:20:20 生成的子表名称为"2019-01-01" 可以么? 或者不用子表,也可以是数组等集合对象. 我只想要每天对应的当天所有的记录集合 [/quote] 数组之类的,你看我5楼写的呢,我把标题和数量都放在哪了,分号分隔的是每天的数据,冒号是标题加数量。 如果是子表的情况,感觉不对劲……每次还有新建很多表,数据库结构太乱了,要用游标动态语句来写,性能也不好
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
引用 17 楼 二月十六 的回复:
生成子表可以实现,但是我觉得这样做有问题,生成的表名称是什么,你的程序怎么知道的表名称,这些都是问题




比如以下2条记录
2019-01-01 20:50:20 和 2019-01-01 19:20:20

生成的子表名称为"2019-01-01"

可以么?

或者不用子表,也可以是数组等集合对象.

我只想要每天对应的当天所有的记录集合
阿 枫 2019-02-25
  • 打赏
  • 举报
回复
感谢分享谢谢
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
引用 17 楼 二月十六 的回复:
生成子表可以实现,但是我觉得这样做有问题,生成的表名称是什么,你的程序怎么知道的表名称,这些都是问题



子表的名称就是对应天的字符串表示,比如:

子表1: 名称为"2019-01-01"
'2019-01-01',N'标题1',10
'2019-01-01',N'标题2',20

子表2: 名称为"2019-01-02"
'2019-01-02',N'标题3',30

子表3: 名称为"2019-01-03"
'2019-01-05',N'标题4',40
二月十六 2019-02-25
  • 打赏
  • 举报
回复
引用 16 楼 大熊猫侯佩 的回复:
[quote=引用 13 楼 二月十六 的回复:] [quote=引用 12 楼 大熊猫侯佩 的回复:] [quote=引用 9 楼 二月十六 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([createDate] Date,[title] nvarchar(23),[count] int)
Insert #T
select '2019-01-01',N'标题1',10 union all
select '2019-01-01',N'标题2',20 union all
select '2019-01-02',N'标题3',30 union all
select '2019-01-05',N'标题4',40
Go
--测试数据结束
SELECT createDate ,COUNT(1) AS [count] FROM #T GROUP BY createDate
我的表述有误,请看第8楼! [/quote] 你就按我写的这个测试数据给出想要的结果是什么?[/quote] 我想要的结果是生成如下3张子表,每张子表内容时某一天的所有记录: 子表1: '2019-01-01',N'标题1',10 '2019-01-01',N'标题2',20 子表2: '2019-01-02',N'标题3',30 子表3: '2019-01-05',N'标题4',40 [/quote] 生成子表可以实现,但是我觉得这样做有问题,生成的表名称是什么,你的程序怎么知道的表名称,这些都是问题
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
引用 13 楼 二月十六 的回复:
[quote=引用 12 楼 大熊猫侯佩 的回复:]
[quote=引用 9 楼 二月十六 的回复:]
这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([createDate] Date,[title] nvarchar(23),[count] int)
Insert #T
select '2019-01-01',N'标题1',10 union all
select '2019-01-01',N'标题2',20 union all
select '2019-01-02',N'标题3',30 union all
select '2019-01-05',N'标题4',40
Go
--测试数据结束
SELECT createDate ,COUNT(1) AS [count] FROM #T GROUP BY createDate





我的表述有误,请看第8楼!
[/quote]
你就按我写的这个测试数据给出想要的结果是什么?[/quote]



我想要的结果是生成如下3张子表,每张子表内容时某一天的所有记录:

子表1:
'2019-01-01',N'标题1',10
'2019-01-01',N'标题2',20

子表2:
'2019-01-02',N'标题3',30

子表3:
'2019-01-05',N'标题4',40


二月十六 2019-02-25
  • 打赏
  • 举报
回复
引用 14 楼 大熊猫侯佩 的回复:
我不是要每天记录个数的统计,这样我早就自己搞定了. 我是要每天的记录集合! 我现在是用代码划分的! 是不是没法用查询语句实现???
可以实现,你先把你想要的写出来啊 比如有123 我想要456,写具体的数据和例子,不要过多的文字描述和解释。
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
我不是要每天记录个数的统计,这样我早就自己搞定了.

我是要每天的记录集合!

我现在是用代码划分的!

是不是没法用查询语句实现???


二月十六 2019-02-25
  • 打赏
  • 举报
回复
引用 12 楼 大熊猫侯佩 的回复:
[quote=引用 9 楼 二月十六 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([createDate] Date,[title] nvarchar(23),[count] int)
Insert #T
select '2019-01-01',N'标题1',10 union all
select '2019-01-01',N'标题2',20 union all
select '2019-01-02',N'标题3',30 union all
select '2019-01-05',N'标题4',40
Go
--测试数据结束
SELECT createDate ,COUNT(1) AS [count] FROM #T GROUP BY createDate
我的表述有误,请看第8楼! [/quote] 你就按我写的这个测试数据给出想要的结果是什么?
大熊猫侯佩 2019-02-25
  • 打赏
  • 举报
回复
引用 9 楼 二月十六 的回复:
这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([createDate] Date,[title] nvarchar(23),[count] int)
Insert #T
select '2019-01-01',N'标题1',10 union all
select '2019-01-01',N'标题2',20 union all
select '2019-01-02',N'标题3',30 union all
select '2019-01-05',N'标题4',40
Go
--测试数据结束
SELECT createDate ,COUNT(1) AS [count] FROM #T GROUP BY createDate





我的表述有误,请看第8楼!
加载更多回复(19)

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧