完全披露:我是一名SQL初学者。
我拥有美国公司的某些会计和治理指标数据集。它有大约15列和大约1800万行。每一行都是衡量公司,日期和指标的独特组合。这些列包括某些标识符,如isin编号,股票代码等,指标发布的日期,指标描述和指标本身。
我尝试做的是编写一个查询,为所有公司提供某个指标的最新值。在过去几天我无望的搜索中,我开始认为GROUP BY条款可能是我正在寻找的。但是,它似乎并没有完全符合我的需要。我只使用了2列:isin number(公司标识符)和日期。换句话说,我可以吐出一个列表,显示每个公司的最新日期,但我不确定如何添加更多列,如何指定要查看的指标。
任何指导都会受到赞赏,即使它只是指向我正确的方向指向我应该查看的命令。
谢谢!
编辑:哇。感谢您快速彻底的回复。并指出了清晰度和示例数据集/启动查询。更新:我认为我有它的工作。这是我使用的: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"'
我现在正在查看回复,以确保尽可能高效地完成此操作。
答案 0 :(得分: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]
答案 1 :(得分:0)
当您引用date the metric was released
时,您可以使用它来使用Order By对表进行排序。
这是一个非常基本的示例,可用于简单地对数据进行排序并选择前1个值。
请参阅This
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