SQL语句根据另一列中的值消除重复项

时间:2014-02-04 08:36:09

标签: sql ms-access group-by aggregate-functions

我有两个表中的数据,我有一个组合数据的查询,如下所示。我正在尝试消除基于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

3 个答案:

答案 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只会保留一行。