【问题标题】:how to group by, and select from two tables, need two records for each given id如何分组,并从两个表中选择,每个给定的 id 需要两条记录
【发布时间】:2013-08-01 17:36:33
【问题描述】:

我是 SQL 查询的新手。 您能帮我解决以下问题吗?

表 1 报价观察:

id value quotePointId asOfTime 

表 2 报价点:

id, quotoType

quoteType 可以是 LastPrice、RepoRate 等

我需要从表1中选择id和值,asOfTime,quoteType,asOfTime最高,quoteType=LastPrice (=1) or RepoRate (=2)在表2中;我需要返回两条记录,一条为最后价格,一条为每个 id 的回购利率,但最后价格和回购利率都应该是最高的 asOfTime。

我有这个,但它会给出最后价格或回购利率,以 asOfTime 较高者为准。

SELECT QuoteObservations.id, QuoteObservations.value, 
QuoteObservations.quotePointId, max(QuoteObservations.asOfTime) as asOfTime, 
QuoteObservations.dataProviderId, QuotePoints.quoteType 
FROM QuoteObservations, QuotePoints 
WHERE (QuoteObservations.id =1 OR QuoteObservations.id = 2 ) 
AND QuoteObservations.quotePointId = QuotePoints.id 
AND (QuotePoints.quoteType = 1 or QuotePoints.quoteType = 2)
group by QuoteObservations.id, QuoteObservations.value, 
QuoteObservations.quotePointId,QuoteObservations.dataProviderId, QuotePoints.quoteType;

【问题讨论】:

  • “不工作”一词含糊不清。请更具体。

标签: sql group-by


【解决方案1】:

您需要删除限制QuoteObservations.id =1 OR QuoteObservations.id = 2 上结果的 WHERE 条件

这是修改后的 SQL,删除了该条件。我还将 JOIN 条件移到了 JOIN 子句中。

SELECT  QuoteObservations.id, 
        QuoteObservations.value, 
        QuoteObservations.quotePointId,
        max(QuoteObservations.asOfTime) as asOfTime, 
        QuoteObservations.dataProviderId,
        QuotePoints.quoteType 
FROM    QuoteObservations
INNER JOIN
        QuotePoints 
ON      QuoteObservations.quotePointId = QuotePoints.id 
WHERE   QuotePoints.quoteType in (1,2)
group by 
        QuoteObservations.id, 
        QuoteObservations.value, 
        QuoteObservations.quotePointId,
        QuoteObservations.dataProviderId, 
        QuotePoints.quoteType;

【讨论】:

  • 非常感谢,Declan_k
  • 但我的意思是对于 1 个 id,我需要两个报价,一个最新价格,一个 repo_rate,两者都应该是最新的(asOfTime 最高)
  • 是否需要查询两次,一次为quoteType = 1,一次为quottype = 2,才能得到时间戳最高的最后价格和回购利率?
【解决方案2】:
SELECT
    QuoteObservations.id, 
    QuoteObservations.value, 
    QuoteObservations.asOfTime,
    QuotePoints.quoteType
FROM
    QuoteObservations
    LEFT JOIN QuotePoints
    ON QuoteObservations.quotePointId = QuotePoints.id
WHERE
    QuotePoints.quoteType = 1 
    OR QuotePoints.quoteType = 2
ORDER BY 
    QuoteObservations.asOfTime DESC
LIMIT 1;

【讨论】:

    【解决方案3】:

    我创建了这个查询,它有效,但我敢打赌,有更好、更有效的方法可以做到这一点,有人可以帮忙吗?

    select q.*
    from (
                select     QuoteObservations.id, QuoteObservations.value,   QuoteObservations.quotePointId, max(QuoteObservations.asOfTime) as asOfTime, QuoteObservations.dataProviderId, qp.quoteType
                from [QuoteObservations]
                inner join QuotePoints qp
                on qp.id = QuoteObservations.quotePointId
                where quotePointId = 1
                group by QuoteObservations.id, QuoteObservations.value, QuoteObservations.quotePointId, QuoteObservations.dataProviderId
        ) q
    inner join (
    
                select     QuoteObservations.id, QuoteObservations.value, QuoteObservations.quotePointId, max(QuoteObservations.asOfTime) as asOfTime, QuoteObservations.dataProviderId, qp.quoteType
                from [QuoteObservations]
                inner join QuotePoints qp
                on qp.id = QuoteObservations.quotePointId
                where quotePointId = 2
                group by QuoteObservations.id, QuoteObservations.value, QuoteObservations.quotePointId, QuoteObservations.dataProviderId
    ) p
        on  q.id = p.id
    inner join (
                select     QuoteObservations.id, QuoteObservations.value, QuoteObservations.quotePointId, max(QuoteObservations.asOfTime) as asOfTime, QuoteObservations.dataProviderId, qp.quoteType
                from [QuoteObservations]
                inner join QuotePoints qp
                on qp.id = QuoteObservations.quotePointId
                where quotePointId = 10
                group by QuoteObservations.id, QuoteObservations.value, QuoteObservations.quotePointId, QuoteObservations.dataProviderId
    ) s
        on  s.id = p.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多