zoukankan      html  css  js  c++  java
  • 合并求取分组记录的第一条数据

    有朋友问,

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

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

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

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

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

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

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

    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 怎么办?同事说可以利用聚合函数或者自查询,下面是给出的2条SQL语句,功能一样:

    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集成开发工具,该工具可以在官网找到下载链接。

  • 相关阅读:
    Mysql知识总结
    Unity3D UGUI 自动调节大小
    关于 Rijndael 加密
    配置java环境
    二叉查找树
    序列化和反序列化
    关于文件保存/关闭时报错:文件正由另一进程使用,因此该进程无法访问此文件。
    关于Unity中NGUI图片精灵响应鼠标的方法
    用人类的话来描述 里氏转换
    C#中string的相关方法
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/3443395.html
Copyright © 2011-2022 走看看