SQL - 在一对多实例中选择单个记录

时间:2014-07-23 18:30:51

标签: sql

我正在连接多个表,其中一个表具有与每个条目关联的时间戳。我正在使用此特定表来标识单个时间戳。

困难在于,在少数情况下,逻辑重复自身并且我得到重复记录,唯一的区别是时间戳。我正在寻找的是一种只返回最早时间戳的方法。

示例:

查询结构

Select Table1.ID, Table1.Timestamp, Table2.Text, Table3.text2

from Table3

left join table2
on Table2.id=Table3.id
left join table1
ON table2.id=table1.ID

where table1.text like '%From Group 1%'

输出示例当前

ID, Timestamp, Text, Text2

98, 2/4/2014, xxx, xxxx

99, 3/1/2014, xxxx, xxxx

99, 3/2/2014, xxx, xxxx <----Do not want 2nd Record

理想输出

ID, Timestamp, Text, Text2

98, 2/4/2014, xxx, xxxx

99, 3/1/2014, xxx, xxxx <---- Only 1 Record (earliest timestamp)

3 个答案:

答案 0 :(得分:0)

您要在此处执行的操作是使用GROUP BY子句。您不能使用DISTINCT,因为您返回多个列,因此DISTINCT子句不会返回预期值。然后,您还需要添加一个ORDER BY语句,以便确保获得每个组的最早日期(指向table1.Ids​​集合的组)。

尝试这样的事情:

SELECT Table1.ID, Table1.Timestamp, Table2.Text, Table3.Text2
FROM Table3
LEFT JOIN Table2 ON Table2.ID = Table3.ID
LEFT JOIN Table1 ON Table2.ID = Table1.ID
WHERE Table1.Text LIKE '%From Group 1%'
GROUP BY Table1.ID // This will ensure only one appearance of each Table1 ID
ORDER BY Table1.Timestamp ASC // This will put the earliest timestamp first, so it will be the one appearance that is returned in the result set.

如果您需要我更深入地解释任何一个添加,请告诉我,因为这是一个非常棘手的查询。

修改

经过深思,DISTINCT子句可以在这里工作,因为你不希望任何列有任何重复值。所有你需要改变的是在SELECT之后添加关键字DISTINCT,你可以摆脱GROUP BY语句。保留ORDER BY语句是个好主意,因为您希望确保最早的时间戳是出现的时间戳。

SELECT DISTINCT Table1.ID, Table1.Timestamp, Table2.Text, Table3.Text2
FROM Table3
LEFT JOIN Table2 ON Table2.ID = Table3.ID
LEFT JOIN Table1 ON Table2.ID = Table1.ID
WHERE Table1.Text LIKE '%From Group 1%'
ORDER BY Table1.Timestamp ASC

如果您不熟悉DISTINCT条款,请参阅此处的更多信息。

答案 1 :(得分:0)

您可以使用SQL函数DISTINCT来选择不同的记录:

Select Distinct Table1.ID, Table1.Timestamp, Table2.Text, Table3.text2

from Table3

left join table2
on Table2.id=Table3.id
left join table1
ON table2.id=table1.ID

where table1.text like '%From Group 1%'

答案 2 :(得分:0)

根据您要查看的时间戳,您可以检索ID,文本和文本2的每个分组的第一个时间戳:

select
    Table1.ID,
    MIN(Table1.Timestamp) as TimeStamp,
    Table2.Text,
    Table3.Text2
from Table3
    left join Table2
        on Table2.ID=Table3.ID
    left join Table1
        on Table2.ID=Table1.ID
where Table1.Text like '%From Group 1%'
group by
    Table1.ID,
    Table2.Text,
    Table3.Text2