2017-03-07 15 views
1
Table1: 
Id Word Frequency 
1 A 1 
2 B 5 


Table2: 
Id Word SecondWord SecondFrequency 
1 A A1  1   
2 A A2  5 
3 A A3  10 
4 A A4  9 
5 A A5  20 
6 B B1  5 
7 B B2  8 
8 B B3  50 
9 B B4  40 
10 B B5  68 

需要的输出 前3名的记录从“表2” SQL连接与SecondFrequency说明 防爆订单。情结与前10排

Word Frequency SecondWord SecondFrequency 
A 1  A5  20 
A 1  A3  10 
A 1  A4  9 
B 5  B5  68 
B 5  B3  50 
B 5  B4  40 

我怎样才能的愿望输出

+1

到目前为止您尝试过什么? – ckruczek

+0

我试过一些Url [link1](http://stackoverflow.com/questions/2043259/sql-server-how-to-join-to-first-row) [link1](http://stackoverflow.com/questions/6841605/get-top-1-row-of-group) 但没有成功 – Kaplesh

回答

1

可以使用Row Number。通过使用Row Number,您可以根据他们的SecondFrequency为每行赋予相同的“单词”数字。如果更改了“单词”,这些号码将被重置。

;with cte as 
(
    select *, ROW_NUMBER() OVER (PARTITION BY Word ORDER BY SecondFrequency DESC) AS RowNumber from table2 
) 
select A.Word, B.Frequency, A.SecondWord, A.SecondFrequency 
    from cte A left join table1 B 
     on A.Word = B.Word 
where A.RowNumber < 4 
2
Use ROWNUMBER function based on second frequency for get you required result: 

CREATE TABLE #Table1(Id TINYINT, Word VARCHAR(1),Frequency TINYINT) 
CREATE TABLE #Table2(Id TINYINT, Word VARCHAR(1),SecondWord 
VARCHAR(2),SecondFrequency TINYINT) 

INSERT INTO #Table1(Id, Word ,Frequency) 
SELECT 1,'A',1 UNION ALL 
SELECT 2,'B',5 

INSERT INTO #Table2(Id, Word ,SecondWord ,SecondFrequency) 
SELECT 1,'A','A1',1 UNION ALL   
SELECT 2,'A','A2',5 UNION ALL 
SELECT 3,'A','A3',10 UNION ALL 
SELECT 4,'A','A4',9 UNION ALL 
SELECT 5,'A','A5',20 UNION ALL 
SELECT 6,'B','B1',5 UNION ALL 
SELECT 7,'B','B2',8 UNION ALL 
SELECT 8,'B','B3',50 UNION ALL 
SELECT 9,'B','B4',40 UNION ALL 
SELECT 10,'B','B5',68 

SELECT * 
FROM 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY #Table1.Word ORDER BY 
      SecondFrequency DESC) RNo ,#Table1.Word ,#Table1.Frequency, 
      SecondWord ,SecondFrequency 
    FROM #Table1 
    JOIN #Table2 ON #Table1.Word = #Table2.Word 
) A 
    WHERE RNo BETWEEN 1 AND 3 

+0

您的回答也是正确的,非常感谢。 – Kaplesh

0

内部加入Row_Number()将有助于在这种情况下!

CREATE TABLE #Table1 
(
    Id INT 
    ,Word VARCHAR(10) 
    ,Frequency INT 
) 

INSERT INTO #Table1 SELECT 1,'A',1 
UNION SELECT 2,'B',5 

CREATE TABLE #Table2 
(
    Id INT 
    ,Word VARCHAR(10) 
    ,SecondWord VARCHAR(10) 
    ,SecondFrequency INT 
) 

INSERT INTO #Table2 SELECT 
1,'A','A1',1 UNION ALL SELECT 
2,'A','A2',5 UNION ALL SELECT 
3,'A','A3',10 UNION ALL SELECT 
4,'A','A4',9 UNION ALL SELECT 
5,'A','A5',20 UNION ALL SELECT 
6,'B','B1',5 UNION ALL SELECT 
7,'B','B2',8 UNION ALL SELECT 
8,'B','B3',50 UNION ALL SELECT 
9,'B','B4',40 UNION ALL SELECT 
10,'B','B5',68 

SELECT * FROM #Table1 
SELECT * FROM #Table2 

SELECT X.Word,X.Frequency,X.SecondWord,X.SecondFrequency 
FROM 
(SELECT T1.Word,T1.Frequency,T2.SecondWord,T2.SecondFrequency,ROW_NUMBER() OVER(PARTITION BY T1.WORD ORDER BY T2.SecondFrequency desc) as RN 
FROM #Table1 T1 
JOIN #Table2 T2 
ON T1.Word = T2.Word 
) AS X 
WHERE X.RN<=3 
0
  1. 从TABLE_2获得前3行
  2. 加入TABLE_1
  3. 语法是:ROW_NUMBER()OVER(PARTITION BY COL1 ORDER BY COL2)为num COL1是列组和COL2是排序的列,num是要使用的分类号码限制结果

    SELECT t2.Word, 
         t1.Frequency, 
         t2.SecondWord, 
         t2.SecondFrequency 
    FROM 
        (SELECT * 
        FROM 
        (SELECT Word, 
          SecondWord, 
          SecondFrequency, 
          ROW_NUMBER() over(PARTITION BY Word 
               ORDER BY SecondFrequency DESC) AS num 
         FROM Table_2) T 
        WHERE T.num <= 3) t2 
    JOIN Table_1 AS t1 ON t2.Word = t1.Word 
    ORDER BY t2.SecondFrequency DESC;