1
id  name   NumofPup     Decade 
---|-----|------------|--------|
1  | Ace | 7          | 1930   | 
2  | Bel | 6          | 1930   | 
3  | Cha | 2          | 1930   | 
4  | Bel | 10         | 1980   | 
5  | Dew | 6          | 1980   | 
6  | Bel | 2          | 1990   | 

この表は、ある人が 10 年間に書いた記事の数を示しています。たとえば、ベルは 1930 年に 6 本、1980 年に 10 本、1990 年に 2 本の記事を書きました。

数十年ごとに、最も多くの記事を書いた人を入手する必要があります。結果は次のようになります。

id  name   NumofPup     Decade 
---|-----|------------|--------|
1  | Ace | 7          | 1930   | 
4  | Bel | 10         | 1980   | 
6  | Bel | 2          | 1990   | 

以下は、これまでにテーブル 1 を生成するコードです。

SELECT authDec.name, COUNT(authDec.name) as NumOfPupPerDECADE, authDec.decade
FROM
    (
    SELECT a.name, year, (year/10)*10 AS decade
    FROM publication pub, author a, authored auth
    WHERE year IS NOT NULL and pub.pubId = auth.pubId and auth.id = a.id
) as authDec
GROUP BY authDec.name, authDec.decade
ORDER BY authDec.decade, NumOfPupPerDECADE DESC

Author は name と AuthorID を保持します Publication は pubID を保持し、ArticleName Authored は AUthorID と pubID を保持します

そして、私は立ち往生しています。私の質問は、各 10 年間で最も多くの記事を書いた著者をどのように取得するかということです。

4

3 に答える 3

1

これを行う 1 つの方法は、row_number() 関数を使用することです。

with cte as (
    select *, row_number() over(partition by Decade order by NumofPup desc) as rn
    from Table1
)
select id, name, NumofPup, Decade
from cte
where rn = 1

またはこのように:

select t.id, t.name, t.NumofPup, t.Decade
from Table1 as t
where
    exists (
        select 1
        from Table1 as t2
        where t2.Decade = t.Decade
        having max(t2.NumofPup) = t.NumofPup
    )

sql fiddle demo

10 年間で最大数の記事を書いた人が複数いる可能性があることに注意してください。最初のクエリは最大数を書いた最初の人をアルファベット順に返し、2 番目のクエリはすべての人を返します (SQL フィドルの例を参照)。

于 2013-10-15T05:52:35.497 に答える
0

通常、これらの問題を解決するには、どの DBMS でも機能する 2 つの方法があります。

左結合アプローチ:

SELECT t1.* FROM t t1
LEFT JOIN t t2 ON t1.Decade = t2.Decade AND t1.NumOfPup < t2.NumOfPup
WHERE t2.Decade IS NULL;

サブクエリのアプローチ:

SELECT t1.* FROM t t1
INNER JOIN (
  SELECT Decade, max(NumOfPup) maxNumOfPup FROM t
  GROUP BY Decade
) s ON t1.Decade = s.Decade AND t1.NumOfPup = s.maxNumOfPup

ここでフィドル。

どちらも次の結果になります。

| ID | NAME | NUMOFPUP | DECADE |
|----|------|----------|--------|
|  1 |  Ace |        7 |   1930 |
|  4 |  Bel |       10 |   1980 |
|  6 |  Bel |        2 |   1990 |
于 2013-10-15T06:53:52.613 に答える