文章类型: DATABASE
关键词: 数据库,sql,access,合并,求取,分组记录,第一条数据
内容摘要: SQL中合并求取分组记录的第一条数据

SQL中合并求取分组记录的第一条数据

2019/4/8 8:48:32    来源:apple    阅读:

有朋友问,

关于电影记录的查询SQL,突然不知道如何下手,给个提示参考一下啊,谢谢。

比如,table_mv 表记录电影的基础信息,包括三个字段 名称,链接,归类

变形金刚第一部  电影链接归类(变形金刚)
变形金刚第二部  电影链接归类(变形金刚)
变形金刚第三部  电影链接归类(变形金刚)
终结者  电影链接归类。

在查询时规则如下,如果归类为空,则正常,如果归类有值,则汇总,
名称为归类名称,连接默认为第一个,
查询结果为:

变形金刚  电影链接归类(变形金刚)
终结者  电影链接归类。

---------------------------------

当时初略的想了想,可以用分组取出来,但写了下又不行,于是按照需求,创建一个表并且插入数据来测试:

复制代码

CREATE TABLE MovieInfo

(

  Name varchar(50) not null,

  Link varchar(250) not null,

  MovieType varchar(20)

)

 

GO

 

INSERT INTO MovieInfo VALUES ('变形金刚第一部','电影链接1','变形金刚');

INSERT INTO MovieInfo VALUES ('变形金刚第二部','电影链接2','变形金刚');

INSERT INTO MovieInfo VALUES ('变形金刚第三部','电影链接3','变形金刚');

INSERT INTO MovieInfo VALUES ('终结者','电影链接A',NULL);

INSERT INTO MovieInfo VALUES ('英雄','电影链接A1',NULL);

 

INSERT INTO MovieInfo VALUES ('007第一部','电影链接11','007');

INSERT INTO MovieInfo VALUES ('007第二部','电影链接12','007');

INSERT INTO MovieInfo VALUES ('007第三部','电影链接13','007');

 

GO

 

SELECT * FROM MovieInfo;

复制代码

先写一个分组并求分组后的记录大于1的查询:

select MovieType from MovieInfo

   where MovieType is not null

      group by MovieType

         having  count(*) >1

结果是:

MovieType

007

变形金刚

根据这个查询可以进一步取到对应的名字:

复制代码

select top 1 MovieType, Name  from  MovieInfo where MovieType  in

(

select MovieType from MovieInfo

   where MovieType is not null

      group by MovieType

         having  count(*) >1

)

group by MovieType,Name

复制代码

无奈结果不是预期的那样,只有1条记录:

MovieType    Name

007    007第二部

在同事的指导下,说ROW_NUMBER() 可以在给记录编号的同时指定分组,然后我们取分组中编号为1的记录即可,先来分组编号,看看记录情况:

 

SELECT ROW_NUMBER() OVER(partition by MovieType ORDER BY Name) as row, * FROM MovieInfo   WHERE MovieType is not null

结果是:

复制代码

row    Name    Link    MovieType

1    007第二部    电影链接12    007

2    007第三部    电影链接13    007

3    007第一部    电影链接11    007

1    变形金刚第二部    电影链接2    变形金刚

2    变形金刚第三部    电影链接3    变形金刚

3    变形金刚第一部    电影链接1    变形金刚

复制代码

OK,现在可以给出完整的查询了,这个查询需要用到联合查询,统计那些没有分组的记录:

复制代码

select Name,Link,MovieType from (

SELECT ROW_NUMBER() OVER(partition by MovieType ORDER BY Name) as row, * FROM MovieInfo   WHERE MovieType is not null

) t

where t.row=1

union

SELECT Name,Link,MovieType FROM MovieInfo WHERE MovieType is null

复制代码

结果是:

Name    Link    MovieType

007第二部    电影链接12    007

变形金刚第二部    电影链接2    变形金刚

英雄    电影链接A1    NULL

终结者    电影链接A    NULL

后来想想,如果没有Row_Number 怎么办?同事说可以利用聚合函数或者自查询,下面是给出的2SQL语句,功能一样:

select * from MovieInfo a where name=(select MIN(name) from MovieInfo where MovieType=a.MovieType)

select * from MovieInfo a where name=(select TOP 1 name from MovieInfo where MovieType=a.MovieType)

由于常常使用ORM,很久没有练习SQL了,这里做一个笔记,感谢同事的指导。

下面是我今天练习这个SQL查询的PDF.NET集成开发工具,该工具可以在官网找到下载链接。

image.png


↑ 上一篇文章:在UEFI模式下用GHOST装系统 关键词:UEFI,模式,GHOST,安装,系统 发布日期:2019/3/29 11:26:39
↓ 下一篇文章:SQLiteDatabase简介 关键词:SQLiteDatabase,openDatabase,.. 发布日期:2019/4/15 15:50:05
相关文章:
ACCESS数据库分页的SQL语句 关键词:ACCESS,数据库,分页,SQL语句 发布日期:2017-11-27 15:28
三种数据库利用SQL语句进行高效果分页 关键词:数据库,SQL,高效,分页,oracle,access 发布日期:2015-07-29 14:33
如何把Sql Server数据库转换成Access 关键词:Sql,Server,数据库,转换,Access 发布日期:2016-09-19 11:18
相关目录:.NETVC&C++DATABASEJAVA
我要评论
正在加载评论信息......