我有两个表中的数据,我有一个组合数据的查询,如下所示。我正在尝试消除基于Id列的重复项,其中我选择具有最早分割日期的记录。任何人都可以帮助我使用SQL语句来实现这一点吗?
|ID |SecID |ReportingDate |SplitDate |Adjustor|
|1465 |2 |31-Dec-09 |01-Nov-10 |0.1 |
|1465 |2 |31-Dec-09 |27-Dec-12 |0.2 |
|1466 |2 |31-Dec-10 |27-Dec-12 |0.2 |
|1468 |2 |31-Dec-11 |27-Dec-12 |0.2 |
|1469 |2 |31-Dec-08 |01-Nov-10 |0.1 |
|1469 |2 |31-Dec-08 |27-Dec-12 |0.2 |
结果如下:
|ID |SecId |ReportingDate |Adjustor |
|1469 |2 |31-Dec-08 |0.1 |
|1465 |2 |31-Dec-09 |0.1 |
|1466 |2 |31-Dec-10 |0.2 |
|1468 |2 |31-Dec-11 |0.2 |
更多信息:
让我解释一下我在这里要做的事情。
在基本面表格中,我有一行,其中包含唯一的行ID,secId(产品标识符)和此行的报告日期。
需要使用splitdetails表中的信息调整此信息,该表具有适用的日期,它影响的secId(产品)以及要使用的调整器比率。
对于基本面表中的每一行:
- 如果任何secId在分割表中没有条目,则调整器应为1.
- 如果在Splits表中存在secId,则要使用的拆分是最早的拆分,其日期早于要检查的基本表报告日期。
我希望从上面的示例中获得结果最终看起来像这样:
| ID | SecId | ReportingDate | Adjustor |
| 1469 2 31-Dec-08 0.1
| 1465 2 31-Dec-09 0.1
| 1466 2 31-Dec-10 0.2
| 1468 2 31-Dec-11 0.2
| 1467 2 31-Dec-12 1
我使用的查询是
SELECT Gotten.ID,Gotten.SecID,Gotten.ReportingDate,Gotten.SplitDate,Adjustor
从
(SELECT tblFundamentalsDetails.id,tblFundamentalsDetails.SecId,tblFundamentalsDetails.ReportingDate,tblSplitDetails.SplitDate,tblSplitDetails.Adjustor
来自tblFundamentalsDetails
LEFT JOIN tblSplitDetails
ON(tblFundamentalsDetails.ReportingDate
答案 0 :(得分:1)
对于名为[Source]
的表(或保存的查询)中的测试数据ID SecID ReportingDate SplitDate Adjustor
---- ----- ------------- ---------- --------
1465 2 2009-12-31 2010-11-01 0.1
1465 2 2009-12-31 2012-12-27 0.2
1466 2 2010-12-31 2012-12-27 0.2
1468 2 2011-12-31 2012-12-27 0.2
1469 2 2008-12-31 2010-11-01 0.1
1469 2 2008-12-31 2012-12-27 0.2
以下查询已经过测试,实际上可以在Access 中运行:
SELECT
Source.ID,
Source.SecID,
Source.ReportingDate,
Source.Adjustor
FROM
Source
INNER JOIN
(
SELECT ID, MIN(SplitDate) AS MinOfSplitDate
FROM Source
GROUP BY ID
) AS MinDate
ON MinDate.ID = Source.ID
AND MinDate.MinOfSplitDate = Source.SplitDate
返回
ID SecID ReportingDate Adjustor
---- ----- ------------- --------
1465 2 2009-12-31 0.1
1466 2 2010-12-31 0.2
1468 2 2011-12-31 0.2
1469 2 2008-12-31 0.1
答案 1 :(得分:0)
一种方法,在Access SQL中应该没问题(尽管您可能需要更改别名):
SELECT a.*
FROM Table1 a
INNER JOIN
(
SELECT ID, sdate = min(SplitDate)
FROM Table1
GROUP BY ID
) b
ON a.ID = b.ID
AND a.SplitDate = b.sdate
此外,您可以在内部查询并在Access中创建自己的qry。
答案 2 :(得分:0)
我可以在MySQL服务器上执行此操作,如果我了解您这就是您所需要的:
DELETE t1 FROM mytable t1, mytable t2 WHERE t1.ID = t2.ID
AND t1.ReportingDate < t2.ReportingDate
这只会在mytable中保留最新日期和相同ID
的行请注意,具有相同ID的三行将只变为一行。每个ID只会保留一行。