sql server 同一列的相同数据 则给与同一个一个编号

qq_41679032 2018-02-01 02:54:26
之前找大神处理过,但是行数少的话可以处理,关键我这数据量有好几万行数
跑了十几分钟跑不出来 TOP 100的话 5秒左右几秒出来 ,
我用 DENSE_RANK() 函数能直接给分组排序 但是还得判断一层时间差值是否大于24小时才行,刚刚用sql 不是很熟悉,小白一个,得怎样写,求助,
例如:有A、B、C 三列 :
序号 城市 时间差值
1 北京 0
2 北京 150.1
3 北京 15.1
4 北京 60.2
5 上海 0
6 上海 22.3
7 南京 0
8 南京 5.6
9 深圳 0
10 深圳 22.1

以B列和C列为标准 首先判断B列相同 并且本次出现时间与上次时间大于24小时为有效 否则 标识为相同编号

1和2行 3和4行, 城市列均为 ‘北京’ 但是时间差值大于24小时(这个值是之前处理过得到的,上下两行日期的差值) 则标识不同 。
4、5行 城市列不同 则标识不同,以此类推,得到一下预期结果:

序号 城市 时间差值 标识ID
1 北京 0 1
2 北京 150.1 2
3 北京 15.1 2
4 北京 60.2 3
5 上海 0 4
6 上海 22.3 4
7 南京 0 5
8 南京 5.6 5
9 深圳 0 6
10 深圳 22.1 6
...全文
3068 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
keueng 2018-02-02
  • 打赏
  • 举报
回复
引用 6 楼 zjcxc 的回复:
好像没理解对, 似乎应该是: 时间差值 > 24 or 城市与上条不同时,序号加1 如果是的话,用下面这个
SELECT *, DENSE_RANK()OVER(ORDER BY 城市, _r)
FROM(
	SELECT *,
		SUM(CASE WHEN 时间差值 > 24 THEN 1 END) OVER(PARTITION BY 城市 ORDER BY 序号) as _r
	FROM #t
)a
ORDER BY 城市, 序号
版主对开窗函数的理解真心厉害..
zjcxc 2018-02-01
  • 打赏
  • 举报
回复 1
好像没理解对, 似乎应该是: 时间差值 > 24 or 城市与上条不同时,序号加1 如果是的话,用下面这个
SELECT *, DENSE_RANK()OVER(ORDER BY 城市, _r)
FROM(
	SELECT *,
		SUM(CASE WHEN 时间差值 > 24 THEN 1 END) OVER(PARTITION BY 城市 ORDER BY 序号) as _r
	FROM #t
)a
ORDER BY 城市, 序号
zjcxc 2018-02-01
  • 打赏
  • 举报
回复
测试 10 万记录,可以在几秒内完成
-- 10 万测试数据
SELECT TOP(10000*10)
	序号 = IDENTITY(int, 1, 1), 城市 = O.name, 时间差值=ABS(CHECKSUM(NEWID()))%47
INTO #t
FROM sys.all_objects O, sys.all_objects B
;

-- 查询( LAG 函数取上条记录值,在 >=2012 的版本中支持)
SELECT *, SUM(_r)OVER(ORDER BY 城市, 序号)
FROM(
	SELECT *,
		CASE CASE WHEN 时间差值 > 24 THEN 1 ELSE 0 END
			WHEN LAG(CASE WHEN 时间差值 > 24 THEN 1 ELSE 0 END, 1, 2)OVER(PARTITION BY 城市 ORDER BY 序号)
			THEN 0 ELSE 1
		END as _r
	FROM #t
)A
ORDER BY 城市, 序号
GO
DROP TABLE #t
jaki-egg 2018-02-01
  • 打赏
  • 举报
回复
use Tempdb
go
if not object_id(N'Tempdb..#tabA') is null
drop table #tabA
Go
Create table #tabA(id int identity(1,1),[城市] nvarchar(20),[时间差值] float)
INSERT INTO #tabA VALUES ('北京','0')
INSERT INTO #tabA VALUES ('北京','150.1')
INSERT INTO #tabA VALUES ('北京','15.1')
INSERT INTO #tabA VALUES ('北京','60.2')
INSERT INTO #tabA VALUES ('上海','0')
INSERT INTO #tabA VALUES ('上海','22.3')
INSERT INTO #tabA VALUES ('南京','0')
INSERT INTO #tabA VALUES ('南京','5.6')
INSERT INTO #tabA VALUES ('深圳','0')
INSERT INTO #tabA VALUES ('深圳','22.1')
Go

select id,城市,时间差值,标识ID=dense_rank() over (order by 城市,时间差) from
(select a.* , 时间差 =case when abs(a.时间差值-b.时间差值)>24 then a.id else 0 end from #tabA as a left join #tabA as b on a.城市=b.城市 and a.id=b.id+1) c




不懂为啥2,3的标识是一样的你看看这样行吗?
keueng 2018-02-01
  • 打赏
  • 举报
回复
贴一下结果
keueng 2018-02-01
  • 打赏
  • 举报
回复
试试看:

IF OBJECT_ID(N'tempdb..#t') IS NOT NULL
	DROP TABLE #t
GO

CREATE TABLE #t
(
	序号		INT
	, 城市		VARCHAR(10)
	, 时间减值	FLOAT	
)

INSERT INTO #t VALUES 
(1,'北京',0),
(2,'北京',150.1),
(3,'北京',15.1),
(4,'北京',60.2),
(5,'上海',0),
(6,'上海',22.3),
(7,'南京',0),
(8,'南京',5.6),
(9,'深圳',0),
(10,'深圳',22.1);

WITH CTE
	AS
	(
		SELECT	A.*
				, B.[城市] AS 城市B
		FROM	#t AS A
				LEFT JOIN #t AS B
					ON A.序号 = B.序号 + 1
	)
	, CTEB
	AS
	(
		SELECT	*
				, CASE 
					WHEN 城市 = 城市B AND 时间减值 >= 24 THEN 1
					WHEN 城市 != 城市B THEN 1
					ELSE 0
				  END 标识ID2
		FROM	CTE 
	)

SELECT	A.序号
		, A.城市
		, A.时间减值
		, 标识ID = (
			SELECT	SUM(标识ID2) + 1
			FROM	CTEB AS B
			WHERE	B.序号 <= A.序号
		)
FROM	CTEB AS A
shoppo0505 2018-02-01
  • 打赏
  • 举报
回复
看不太懂需求。
论分布式数据库的设计与实现 摘要:本文讨论某高校管理信息系统中分布式数据库的设计与实现。该系统架构设计 采用c/s与b/s混合的架构方式。在全局数据与各院系的数据关系中,采用水平分片的方 式;在全局数据与各部门之间,以及数据库服务器与web数据库服务器的数据关系中,采 用垂直分片的方式。设计过程中采用了基于视图概念的数据库设计方法。开发过程中在 数据集成、测试、分布式数据库部署等方面做了大量的工作。并使用合并复制的方式有 效地解决了分布式数据库中数据同步的问题。 关键词:分布式数据库 架构设计 应用数据集成 合并复制 针对某高校管理信息系统的开发,该高校共有三个校区,总校区和两个校区,教务处等 校级行政部门在总校区办公,15个院、系分布在两个校区。在工作中它们处理各自的数 据,但也需要彼此之间数据的交换和处理,如何处理分散的数据和集中的管理是一个难 题。学校信息系统中复杂而分散的数据信息之间的交换、相互转换和共享等问题是系统 开发要解决的关键性问题,分布式数据库系统技术为解决这个问题提供了可能。 1、系统的架构设计 采用分布式的c/s与b/s混合的架构方式。各院系、部(室)通过局域网直接访问数据库 服务器,软件采用c/s架构;其它师生员工通过internet访问web服务器,通过web服务器 再访问数据库服务器,软件采用b/s架构。学校各部门之间工作时数据交互性较强,采用 c/s架构可以使查询和修改的响应速度快;其它师生员工不直接访问数据库服务器,能保 证学校数据库的相对安全。 2、数据的分布 从全局应用的角度出发,将局部数据库自下而上构成分布式数据库系统,各系部存放本 机构的数据,全局数据库则存放所有业务数据,并对数据进行完整性和一致性的检查, 这种做法虽然有一定的数据冗余,但在不同场地存储同一数据的多个副本,能提高系统 的可靠性和可用性,也提高了局部应用的效率,减少了通讯代价。 将关系分片,有利于按用户需求组织数据的分布,根据不同的数据关系采用了不同的分 片方式: (1)在全局数据与各院系的数据关系中,由于各院系的数据是全局数据的子集,采用了 水平分片的方式。 (2)在全局数据与教务处、总务处等各部门之间,数据是按照其应用功能来划分的,所 以采用了垂直分片的方式。在数据库服务器与web数据库服务器的数据关系中,情况也是 相同,也采用了垂直分片的方式。 3、数据库视图设计 由于系统需要满足来自不同用户的查询需求,如学生查询考试成绩、教师查询考核情况 、师生查询图书信息等,因此使用了大量的视图,来满足各方面的查询需要。另一方面 这种设计也防止了人为因素造成的数据更改,同时满足了系统安全性的需要。 在进行视图设计时,首先从分析各个应用的数据着手,为每个应用建立各自的视图,然 后再把这些视图汇总起来,消除命名冲突和冗余,最后形成整个数据库的概念数据模型 。 4、数据集成 各系部的局部数据在录入后,要及时上报,在全局数据库进行汇总。各部门的数据有更 新变动时,也要及时上报在全局数据库同步更新。再由全局数据库分发给与数据信息有 关的相关部门。如某系学生人数的变化要通知后勤服务部门。人事部门上报教工工作的 调动情况要通知财会部门等。数据的交换集中在各系部局部数据库与全局数据库之间, 提高了系统集成的可靠性;数据交换的功能在中心数据库与各系部间进行,中心数据库 所在的服务器分担大部分数据交换所需的处理工作,可减少各系部之间的数据交换,保 证数据的一致性。在数据库到数据库的操作中,通过两阶段递交协议来确保中心数据库 和分布在各个系部的数据的一致性、完整性。 5、测试 由于该系统涉及到多个系部,数据共享关系复杂,数据量也较大,因此在测试时使用的 是高校系统的真实的数据,从数据的采集、传输、存储、处理和显示等的各个环节,全 面测试了数据库的功能,以及数据库的性能和安全性等,根据测试结果和用户意见进行 了修改。 6、部署 在数据库选型的问题上,考虑到操作人员对sql server数据库比较熟悉,采用sql server数据库构造整个数据库平台。各校区都有自己的数据库服务器,而全局数据库服 务器只有在总校区才有,不同校区之间的数据通过总校区以复制的形式同步,两个分校 区和各系部之间不直接进行数据的复制,这种服务器的分布形式达到了以下两个目的: 首先,全局数据库服务器在总校区,保证了整个学校的数据统一。再者,通过后台的数 据的同步进程保证了总校区和各部门之间的数据传输,可实现校办总部对下属单位的数 据有条件发放,下属单位数据无条件上传总校,为整体数据提供了安全保障。 在分布式数据库设计中遇到的最主要的一个问题就是数据同步的问题。由于全局数据库 与各部门的数据交换是双向的,各系部需将更新的数据发送到全局数据库,全局数据库 负责整体协调,要向下属单位下发
Microsoft Windows 系统错误代码简单分析:   0000 操作已成功完成。   0001 错误的函数。   0002 系统找不到指定的文件。   0003 系统找不到指定的路径。   0004 系统无法打开文件。   0005 拒绝访问。   0006 句柄无效。   0007 存储区控制块已损坏。   0008 可用的存储区不足, 无法执行该命令。   0009 存储区控制块地址无效。   0010 环境错误。   0011 试图使用不正确的格式加载程序。   0012 访问代码无效。   0013 数据无效。   0014 可用的存储区不足,无法完成该操作。   0015 系统找不到指定的驱动器。   0016 无法删除该目录。   0017 系统无法将文件移到其他磁盘驱动器上。   0018 没有其他文件。   0019 媒体写保护。   0020 系统找不到指定的设备。   0021 设备尚未准备好。   0022 设备无法识别该命令。   0023 数据错误(循环冗余检查)。   0024 程序发出命令,但是该命令的长度错误。   0025 驱动器在磁盘上无法定位指定的区域或磁道。   0026 无法访问指定的磁盘或软盘。   0027 驱动器找不到所请求的扇区。   0028 打印机缺纸。   0029 系统无法写入指定的设备。   0030 系统无法读取指定的设备。   0031 与系统连接的设备不能正常运转。   0032 其他进程正使用该文件,因此现在无法访问。   0033 另一进程已锁定该文件的某一部分,因此现在无法访问。   0034 驱动器中的软盘不正确。请将 %2 (卷标序号: %3)插入驱动器 %1。   0036 打开共享的文件太多。   0038 已到达文件结尾。   0039 磁盘已满。   0050 不支持此网络请求。   0051 远程计算机无法使用。   0052 网络中存在重名。   0053 找不到网络路径。   0054 网络正忙。   0055 指定的网络资源或设备已不可用。   0056 已经达到网络命令的极限。   0057 网络适配器出现错误。   0058 指定的服务器无法执行所请求的操作。   0059 网络出现意外错误。   0060 远程适配器不兼容。   0061 打印机队已满。   0062 服务器上没有存储等待打印的文件的空间。   0063 已经删除等候打印的文件。   0064 指定的网络名无法使用。   0065 拒绝访问网络。   0066 网络资源类型错误。   0067 找不到网络名。   0068 已超过本地计算机网络适配器卡的名称极限。   0069 已超过网络 BIOS 会话的极限。   0070 远程服务器已经暂停或者正在启动过程中。   0071 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。   0072 指定的打印机或磁盘设备已经暂停。   0080 该文件存在。   0082 无法创建该目录或文件。   0083 INT 24 失败。   0084 处理该请求的存储区不可用。   0085 正在使用该本地设备名。   0086 指定的网络密码不正确。   0087 参数错误。   0088 网络出现写入错误。   0089 此时系统无法启动其他进程。 0100 无法创建其他系统标志。   0101 属于其他进程的专用标志。   0102 标志已经设置, 无法关闭。   0103 无法再次设置该标志。   0104 中断时无法请求专用标志。   0105 此标志先前的所有权已终止。   0106 请将软盘插入驱动器 %1。   0107 后续软盘尚未插入,程序停止。   0108 磁盘正在使用或已由其他进程锁定。   0109 管道已经结束。   0110 系统无法打开指定的设备或文件。   0111 文件名太长。   0112 磁盘空间不足。   0113 没有其他可用的内部文件标识符。   0114 目标内部文件标识符不正确。   0117 该应用程序所运行的 IOCTL 调用

22,209

社区成员

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

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