6

私は SQL Server を初めて使用するので、申し訳ありません。

テーブルがあり、GroupBy を実行して、フィールドに関連付けられたカウントが最も高いレコードをfield1返したいと考えています。私は通常、2 つのクエリを使用して MS ACCESS でこれを行います。最初のクエリはデータを降順で返し、2 番目のクエリは First() 関数を使用して最初のレコードを選択します。field2counted

クエリ 1

SELECT t.field1, t.field2, Count(t.counted) AS count1
FROM Table1 AS t
WHERE (((t.counted)=2))
GROUP BY t.field1, t.field2
ORDER BY t.field1, Count(t.counted) DESC;

クエリ 2 (上記のクエリ 1 に基づく)

SELECT q.field1, First(q.field2) AS firstoffield2
FROM q
GROUP BY q.field1;

探している SOURCE DATA とクエリ結果

SQL Server 2008 クエリで上記と同じ結果を達成しようとするのは非常に困難です。誰でも助けることができますか?(使用する必要がある正確な SQL を提供してください)。

データのサブセットと結果の例を次に示します。

表1

field1 ¦ field2 ¦ counted
10     ¦ 20     ¦ 2
10     ¦ 30     ¦ 2
10     ¦ 20     ¦ 2
20     ¦ 30     ¦ 0
20     ¦ 40     ¦ 0
20     ¦ 50     ¦ 1
20     ¦ 50     ¦ 2
20     ¦ 60     ¦ 1

クエリ 1 の結果 (フィールド 1 でグループ化、「カウントされた」フィールド レコードが「2」であるカウント)

field1 ¦ field2 ¦ count1
10     ¦ 20     ¦ 2
10     ¦ 30     ¦ 1
20     ¦ 50     ¦ 1

クエリ 2 の結果 (SQL から取得したい出力)

field1 ¦ firstoffield2
10     ¦ 20
20     ¦ 50

それが少し役立つことを願っています、ありがとう。

4

3 に答える 3

6
WITH
  q AS
(
  Put your query one here
)
,
  sequenced AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY count1 DESC) AS sequence_id,
    *
  FROM
    q
)
SELECT
  *
FROM
  sequenced
WHERE
  sequence_id = 1

これをLAST()に変更するには、ROW_NUMBER()関数で順序の方向を変更します。

于 2012-10-16T17:10:48.153 に答える
1

これは私が今まで書いた中で最も洗練されたクエリではありませんが、次のようなものはどうでしょうか。

SELECT qSource.Field1, qSource.Field2
FROM (SELECT Field1, Field2, COUNT(Counted) AS Count1
    FROM dbo.Table1
    WHERE Counted = 2
    GROUP BY Field1, Field2)qSource
INNER JOIN (SELECT q.Field1,MAX(q.Count1) AS HighestCount
    FROM (SELECT Field1, Field2, COUNT(Counted) AS Count1
        FROM dbo.Table1
        WHERE Counted = 2
        GROUP BY Field1, Field2) q
    GROUP BY q.Field1) qHighest
ON qSource.Field1 = qHighest.Field1
AND qSource.Count1 = qHighest.HighestCount
ORDER BY qSource.Field1
于 2012-10-16T17:12:13.533 に答える