0

我的帖子

个人中心

设置

  发新话题
遇到一个sql 数据处理方式的问题, 试了很多种方法,例如,用存储分步处理。 最后把自己经给搞晕了。




可以了解一下sql 的 pivot函数;



引用:
原帖由 oswica 于 2019-9-2 23:24 发表
可以了解一下sql 的 pivot函数;
谢谢版本的回复,  行转列,  我理解。

但是,有涉及到一个查询 连续值  的问题。 不知道怎么解决, 还望指点下。 谢谢



引用:
原帖由 oswica 于 2019-9-2 23:24 发表
可以了解一下sql 的 pivot函数;
版主您好,  能指导下我吗?



连续个数这里 先取一个最小的,然后取一个最大的即可;

个数用group by 后count即可



引用:
原帖由 oswica 于 2019-9-5 15:56 发表
连续个数这里 先取一个最小的,然后取一个最大的即可;

个数用group by 后count即可
版主,  有多个连续,   如何取最小  是大??



类似这样:
select max(序号),min(序号) from 表 group by 型号



引用:
原帖由 oswica 于 2019-9-6 12:59 发表
类似这样:
select max(序号),min(序号) from 表 group by 型号
可能你太忙啦, 没认识看需求。

不是这样简单的。



多个连续 这里你要识别出来 是否连续,识别连续的办法就是 用当前的序号 加1 和原表 join,如果有 就表明是连续的

通过这个可以分段出,然后在处理;



USE TSQL2012
GO

DROP TABLE T1
CREATE TABLE T1 (
    SN NVARCHAR(100) NOT NULL,
    MODEL NVARCHAR(100) NOT NULL
)
GO


--INSERT INTO T1 VALUES( 'HT16060347', 'PDM-5A' )
--INSERT INTO T1 VALUES( 'HT16060348', 'PDM-5A' )
--INSERT INTO T1 VALUES( 'HT16060349', 'PDM-20A')
--INSERT INTO T1 VALUES( 'HT16060350', 'PDM-20A')
--INSERT INTO T1 VALUES( 'HT16060360', 'PDM-20A')
--INSERT INTO T1 VALUES( 'HT16060361', 'PDM-20A')
--INSERT INTO T1 VALUES( 'HT16060362', 'PDM-20A')

INSERT INTO T1 VALUES( '16060347', 'PDM-5A' )
INSERT INTO T1 VALUES( '16060348', 'PDM-5A' )
INSERT INTO T1 VALUES( '16060349', 'PDM-20A')
INSERT INTO T1 VALUES( '16060350', 'PDM-20A')
INSERT INTO T1 VALUES( '16060360', 'PDM-20A')
INSERT INTO T1 VALUES( '16060361', 'PDM-20A')
INSERT INTO T1 VALUES( '16060362', 'PDM-20A')
GO

SELECT
    CASE WHEN (CAST(TEMP1.nextSN AS INT) - CAST(TEMP1.SN AS INT)) = 1 THEN 'Y' ELSE 'N' END AS [IsSeq],
    *
FROM
    (SELECT
        LEAD(SN) OVER (PARTITION BY T1.MODEL ORDER BY SN) AS nextSN
        ,*
    FROM T1) AS TEMP1



得到的结果

IsSeq    nextSN    SN    MODEL
Y    16060350    16060349    PDM-20A
N    16060360    16060350    PDM-20A
Y    16060361    16060360    PDM-20A
Y    16060362    16060361    PDM-20A
N    NULL    16060362    PDM-20A
Y    16060348    16060347    PDM-5A
N    NULL    16060348    PDM-5A

我觉得快是你要的了,你历遍一下结果集就可以了。但我感觉我可能会用一个辅助表,但我还没想清楚怎么用。
我觉得你还要考虑一个casting SN的问题。


我不太懂pivot,可能会比较简单。



引用:
原帖由 wshou01 于 2019-9-9 19:24 发表
USE TSQL2012
GO

DROP TABLE T1
CREATE TABLE T1 (
    SN NVARCHAR(100) NOT NULL,
    MODEL NVARCHAR(100) NOT NULL
)
GO


--INSERT INTO T1 VALUES( 'HT16060347', 'PDM-5A' )
--INSERT INTO T1 VALUES( 'HT1 ...
搞出来了,用开窗就好

SELECT model, MIN(SN) AS StartSN, MAX(SN) AS EndSN, COUNT(SN) as Total
FROM (
SELECT SN, model, SN-ROW_NUMBER() OVER(ORDER BY model) AS grp
FROM T1) AS D
Group by grp, model

输出
model        StartSN        EndSN        Total
PDM-20A        16060349        16060350        2
PDM-20A        16060360        16060362        3
PDM-5A        16060347        16060348        2



这个坛子 很多牛人都是新新人类



引用:
原帖由 wshou01 于 2019-9-9 20:49 发表

搞出来了,用开窗就好

SELECT model, MIN(SN) AS StartSN, MAX(SN) AS EndSN, COUNT(SN) as Total
FROM (
SELECT SN, model, SN-ROW_NUMBER() OVER(ORDER BY model) AS grp
FROM T1) AS D
Group by grp, model

输出 ...
感谢感谢,。。



‹‹ 上一贴:sql server 网络备份的备份速度跟什么有关 ...   |   下一贴:请问access里如何限制输入电话的位数 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2019 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com