SQL只选择每个id的一次,由最早的日期时间选择

时间:2012-11-27 21:27:02

标签: sql sybase

我目前正在运行类似下面的查询,以便在工作中使用一次性报告流程。

但是,对于表中的每个项目,都有多个关联的“消息”全部保存,这意味着每个项目都会多次返回。根据以下示例和进一步说明,我只想展示每个项目一次。

我意识到这是(至少在我看来)一个糟糕的结构,但报告需要完成,这就是数据的存储方式: - (

SQL小提琴: http://sqlfiddle.com/#!6/76fce/8

查询:

SELECT messageId, receiver, createdDate, itemId from messages_0,items WHERE
    itemId IN (1, 2, 3)
    AND (receiver = '100' OR receiver = '200')
    AND messages_0.description LIKE '%'+items.name+'%'
union all
SELECT messageId, receiver, createdDate, itemId  from messages_1,items WHERE
    itemId IN (1, 2, 3)
    AND (receiver = '100' OR receiver = '200')
    AND messages_1.description LIKE '%'+items.name+'%'

注意:有两个消息表,因此联合所有

示例消息:

messageId | receiver | createdDate       | description
--------------
1         | 100      | 2012/11/27 12:00  | The Dog is awesome
2         | 100      | 2012/11/27 13:00  | Now the Dog is boring
4         | 200      | 2012/11/27 11:30  | I have Wood :-)

示例项目:

itemID | name 
--------------
1      | Dave
2      | Dog
3      | Wood

结果:

messageId | receiver | createdDate      | itemId 
1         | 100      | 2012/11/27 12:00 | 2
2         | 100      | 2012/11/27 13:00 | 2
4         | 200      | 2012/11/27 11:00 | 3

但是,我只需要显示每个项目一次。只显示最旧的行(由createdDate创建)。

目标结果:

messageId | receiver | createdDate      | itemId 
1         | 100      | 2012/11/27 12:00 | 2
4         | 200      | 2012/11/27 11:00 | 3

如何在SQL(Sybase)中执行此操作? 到目前为止,我一直在查看group by(只返回一个id)和某种子查询,但是无法获得任何工作!

SQL小提琴: http://sqlfiddle.com/#!6/76fce/8

1 个答案:

答案 0 :(得分:1)

如果我理解你的话,这样的事情可能就是一个开始。

SELECT
  t, messageId, receiver, createdDate, itemId 
FROM
  (
    SELECT 
      m.messageId, m.receiver, m.createdDate, m.t,
      i.itemId 
    FROM
      items i
      INNER JOIN (
        SELECT description, messageId, receiver, createdDate, 0 t FROM messages_0 
        UNION 
        SELECT description, messageId, receiver, createdDate, 1 t FROM messages_1
      ) m ON m.description LIKE '%' + i.name + '%' 
             AND m.receiver IN ('100', '200')
    WHERE
      i.itemId IN (1, 2, 3)
  ) data
WHERE
  createdDate = (
    SELECT MIN(createdDate) FROM (
      SELECT createdDate FROM messages_0 WHERE messageId = data.messageId AND data.t = 0
      UNION
      SELECT createdDate FROM messages_1 WHERE messageId = data.messageId AND data.t = 1
    )
  )

我会把索引放在

  • messages_0 / messages_1
    • (messageId,createdDate)
    • (receiver,messageId,createdDate,description)
    • (itemId,name)