SQL 实现 在线等

雾灵各吉 2018-09-05 04:32:35
同一个表取数据
获取该表中,获取今天数据和离今天最近一次的数据
...全文
241 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-09-06
  • 打赏
  • 举报
回复
引用 7 楼 fangkuai3 的回复:
[quote=引用 6 楼 yenange 的回复:]
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT IDENTITY(1,1) PRIMARY KEY,
d DATETIME NOT NULL,
[type] INT,
flag VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),1,'')
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),2,'')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,1,GETDATE()-1),1,'1,+1')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,2,GETDATE()-1),2,'2,+2')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,3,GETDATE()-1),1,'1,+3')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,4,GETDATE()-1),2,'2,+4')
GO
--增加索引,便于效率提高
CREATE INDEX ix_t_d ON t(d);
GO
--今天数据
SELECT * FROM t WHERE d>CONVERT(CHAR(10),GETDATE(),120)
UNION ALL
--以前的离今天最近的数据,每种取一条
SELECT id,d,[type],t.flag FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY [type] ORDER BY d desc) AS rid,*
FROM t WHERE d<CONVERT(CHAR(10),GETDATE(),120)
) AS t
WHERE t.rid=1
/*
id d type flag
----------- ----------------------- ----------- ----------
1 2018-09-05 17:36:04.720 1
2 2018-09-05 17:36:04.720 2
5 2018-09-04 17:39:04.720 1 1,+3
6 2018-09-04 17:40:04.720 2 2,+4
*/



需要得出如下结果:
id d type flag dnew type flag
----------- ----------------------- ----------- ----------
1 2018-09-05 17:36:04.720 1 2018-09-04 17:39:04.720 1 +3
2 2018-09-05 17:36:04.720 2 2018-09-04 17:40:04.720 2 2, +4

*/

[/quote]
明白你的意思了, 我的基本上是对的, 但格式要改, 是这样吧?

但是, 如果同一类型, 今天有多条数据的, 前一天的只有一条, 对应哪条呢?
如果今天 type=1 的有 10 条数据, 但昨天 type=1 的只取了一条, 如何去对应?
雾灵各吉 2018-09-06
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1) PRIMARY KEY,
	d DATETIME NOT NULL,
	[type] INT,
	flag VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),1,'')
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),2,'')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,1,GETDATE()-1),1,'1,+1')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,2,GETDATE()-1),2,'2,+2')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,3,GETDATE()-1),1,'1,+3')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,4,GETDATE()-1),2,'2,+4')
GO
--增加索引,便于效率提高
CREATE INDEX ix_t_d ON t(d);
GO
--今天数据
SELECT * FROM t WHERE d>CONVERT(CHAR(10),GETDATE(),120)
UNION ALL
--以前的离今天最近的数据,每种取一条
SELECT id,d,[type],t.flag FROM (
	SELECT ROW_NUMBER() OVER (PARTITION BY [type] ORDER BY d desc) AS rid,* 
	FROM t WHERE d<CONVERT(CHAR(10),GETDATE(),120)
) AS t
WHERE t.rid=1
/*
id          d                       type        flag
----------- ----------------------- ----------- ----------
1           2018-09-05 17:36:04.720 1           
2           2018-09-05 17:36:04.720 2           
5           2018-09-04 17:39:04.720 1           1,+3
6           2018-09-04 17:40:04.720 2           2,+4 
*/

需要得出如下结果: id d type flag dnew type flag ----------- ----------------------- ----------- ---------- 1 2018-09-05 17:36:04.720 1 2018-09-04 17:39:04.720 1 +3 2 2018-09-05 17:36:04.720 2 2018-09-04 17:40:04.720 2 2, +4 */
吉普赛的歌 版主 2018-09-05
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT IDENTITY(1,1) PRIMARY KEY,
d DATETIME NOT NULL,
[type] INT,
flag VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),1,'')
INSERT INTO t (d,[type],flag) VALUES (GETDATE(),2,'')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,1,GETDATE()-1),1,'1,+1')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,2,GETDATE()-1),2,'2,+2')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,3,GETDATE()-1),1,'1,+3')
INSERT INTO t (d,[type],flag) VALUES (DATEADD(minute,4,GETDATE()-1),2,'2,+4')
GO
--增加索引,便于效率提高
CREATE INDEX ix_t_d ON t(d);
GO
--今天数据
SELECT * FROM t WHERE d>CONVERT(CHAR(10),GETDATE(),120)
UNION ALL
--以前的离今天最近的数据,每种取一条
SELECT id,d,[type],t.flag FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY [type] ORDER BY d desc) AS rid,*
FROM t WHERE d<CONVERT(CHAR(10),GETDATE(),120)
) AS t
WHERE t.rid=1
/*
id d type flag
----------- ----------------------- ----------- ----------
1 2018-09-05 17:36:04.720 1
2 2018-09-05 17:36:04.720 2
5 2018-09-04 17:39:04.720 1 1,+3
6 2018-09-04 17:40:04.720 2 2,+4
*/

二月十六 版主 2018-09-05
  • 打赏
  • 举报
回复
列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
lzw_0736 2018-09-05
  • 打赏
  • 举报
回复
上个数据示例,这样大家方便写代码
雾灵各吉 2018-09-05
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
SELECT * FROM 表 WHERE DATEDIFF(DAY,GETDATE(),时间字段)=0
UNION
SELECT TOP 1 * FROM 表 WHERE DATEDIFF(DAY,GETDATE(),时间字段)<>0 ORDER BY 时间字段 DESC
同一个表取数据 获取该表中,获取今天数据和离今天最近一次的数据 今天不同类型的数据有很多条,每条都要离今天最近的数据
雾灵各吉 2018-09-05
  • 打赏
  • 举报
回复
同一个表取数据 获取该表中,获取今天数据和离今天最近一次的数据 今天不同类型的数据有很多条,每条都要离今天最近的数据
二月十六 版主 2018-09-05
  • 打赏
  • 举报
回复
SELECT * FROM 表 WHERE DATEDIFF(DAY,GETDATE(),时间字段)=0
UNION
SELECT TOP 1 * FROM 表 WHERE DATEDIFF(DAY,GETDATE(),时间字段)<>0 ORDER BY 时间字段 DESC

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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