0

完全披露:我是 SQL 初学者。

我有一组美国公司的某些会计和治理指标的数据集。它有大约 15 列和大约 1800 万行。每一行都是公司、日期和被测量指标的独特组合。这些列包括某些标识符,如 isin 编号、股票代码等、度量标准发布的日期、度量标准描述和度量标准本身。

我要做的是编写一个查询,该查询将为所有公司的某个指标生成最新值。在过去几天的无望搜索中,我开始认为 GROUP BY 子句可能是我正在寻找的。但是,它似乎并没有完全满足我的需要。我只使用 2 列:isin 编号(公司标识符)和日期。换句话说,我可以吐出一个显示每家公司最近日期的列表,但我不确定如何在其中添加更多列,如何指定要查看的指标。

任何指导都将不胜感激,即使它只是为我指出我应该研究什么样的命令的正确方向。

谢谢!

编辑:哇。感谢您的快速和彻底的答复。并指出清晰度和示例数据集/开始查询。更新:我想我有它的工作。这是我使用的:

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 BY这样做。 ORDER 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 回答