合並求取分組記錄的第一條數據


有朋友問,

關於電影記錄的查詢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集成開發工具,該工具可以在官網找到下載鏈接。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM