0

完全な開示: 私は SQL の初心者です。

私は、米国企業の特定の会計およびガバナンス指標のデータ セットを持っています。約 15 列、約 1,800 万行あります。各行は、測定対象の会社、日付、およびメトリックの一意の組み合わせです。列には、isin 番号、ティッカー シンボルなどの特定の識別子、メトリックがリリースされた日付、メトリックの説明、およびメトリック自体が含まれます。

私がやろうとしているのは、すべての企業の特定のメトリックの NEWEST 値を生成するクエリを作成することです。ここ数日間の絶望的な検索で、GROUP BY 句が探しているものかもしれないと考えるようになりました。ただし、必要なことを正確に実行していないようです。isin 番号 (会社の識別子) と日付の 2 つの列だけで機能します。つまり、各企業の最新の日付を示すリストを吐き出すことはできますが、これにさらに列を追加する方法、どのメトリックを参照するかを指定する方法がわかりません。

どんな種類のコマンドを調べる必要があるかについて正しい方向に私を向けているだけであっても、どんなガイダンスもありがたいです。

ありがとう!

編集:うわー。迅速かつ完全な回答に感謝します。そして、明確さとサンプルデータセット/開始クエリに注目してください。更新:私はそれが機能していると思います。これが私が使用したものです:

SELECT a1.["id_isin_number"], a1.["metric_description"], a1.["date_period_ends"], a1.["company_metric_value"], a2.maxdate
FROM [AGR Metrics].[dbo].[Audit_Integrity_Metric_Data_File_NA Original_0] a1

INNER JOIN (
           SELECT a2.["id_isin_number"], MAX(a2.["date_period_ends"]) AS maxdate

           FROM [AGR Metrics].[dbo].[Audit_Integrity_Metric_Data_File_NA Original_0] a2

           GROUP BY a2.["id_isin_number"]
           ) a2

ON a1.["date_period_ends"] = a2.maxdate
  AND a1.["id_isin_number"] = a2.["id_isin_number"]
  WHERE a1.["metric_description"] = '"Litigation: Class Action"'

可能な限り効率的にこれを行っていることを確認するために、現在応答を調べています。

4

2 に答える 2

1

これには関数を使用できますROW_NUMBER()(SQL Server 2005 以降を使用している場合)。

SELECT *
FROM (SELECT *,ROW_NUMBER() OVER(PARTITION BY isin ORDER BY [date] DESC) AS RowRank
      FROM YourTable
     )sub
WHERE RowRank = 1

すべてを返したくない場合は、 * の代わりに必要なフィールドをリストしてください。

このROW_NUMBER()関数は各行に番号を追加します。これPARTITION BYはオプションであり、番号付けが 1 から始まるグループを定義するために使用されisinますPARTITION BYORDER BYは必須であり、番号付けの順序 (この場合は日付順) を定義します。

現在のクエリも使用できますが、このROW_NUMBER()方法はよりシンプルで効率的です。

SELECT a.*
FROM YourTable a
JOIN (SELECT isin, MAX([date])
      FROM YourTable
      GROUP BY isin
     )b
 ON a.isin = b.isin
 AND a.[date] = b.[date]
于 2013-09-24T13:37:37.543 に答える
0

を引用するdate the metric was releasedと、 Order By を使用してテーブルを並べ替えることができます。これは、単純にデータを並べ替えて上位 1 つの値を選択するために使用できる非常に基本的な例です。

こちらをご参照ください

 CREATE  TABLE trialOne (
      Id INT NULL,  
      NAME VARCHAR(50) NULL,
      [Date] DATETIME NULL

    )
SELECT * FROM dbo.ETProgram
INSERT INTO trialone VALUES(1,'john','2009-01-06 11:39:51.827') 
INSERT INTO trialone VALUES(2,'joseph','2010-01-06' ) 
INSERT INTO trialone VALUES(3,'Ajay','2009-05-06' ) 
INSERT INTO trialone VALUES(4,'Dave','2009-11-06' ) 
INSERT INTO trialone VALUES(5,'jonny','2004-01-06') 
INSERT INTO trialone VALUES(6,'sunny','2005-01-06') 
INSERT INTO trialone VALUES(7,'elle','2013-01-06' ) 
INSERT INTO trialone VALUES(8,'mac','2012-01-06' ) 
INSERT INTO trialone VALUES(8,'Sam','2008-01-06' ) 
INSERT INTO trialone VALUES(10,'xxxxx','2013-08-06')

SELECT TOP(1)name FROM trialone ORDER BY Date DESC
于 2013-09-24T13:52:46.937 に答える