用于价格差异计算的SQL

时间:2010-01-17 20:11:33

标签: sql

我有两张桌子,我正试图从中获取数据。第一个是'标题'表,它表示产品信息(名称,唯一ID等)。第二个是“价格”表,它收集各种货币的价格信息(每个产品在价格表中可以有多个历史条目)。

我写了一篇相当冗长的SQL语句来获取产品的最新价格变化,但有一些问题希望更有经验的用户能够帮助我:

                SELECT 
                    t.id, 
                    t.name, 
                    t.type, 
                    p.value,
                    (SELECT 
                        value 
                    FROM 
                        prices 
                    WHERE 
                        prices.id = p.id AND 
                        prices.country='US' AND 
                        prices.timestamp < p.timestamp
                    ORDER BY 
                        prices.timestamp DESC 
                    LIMIT 1) AS last_value
                FROM
                    prices AS p
                INNER JOIN
                    titles AS t
                ON
                    t.row_id = p.id
                WHERE
                    p.country = 'US' AND
                    (SELECT 
                        value 
                    FROM 
                        prices 
                    WHERE 
                        prices.id = p.id AND 
                        prices.country='US' AND 
                        prices.timestamp < p.timestamp
                    ORDER BY 
                        prices.timestamp DESC 
                    LIMIT 1) IS NOT NULL
                GROUP BY
                    t.id
                ORDER BY
                    p.timestamp DESC,
                    last_value DESC
                LIMIT 0, 25"

我遇到的第一个问题是,虽然此查询有效,但标题会在同一个列表中多次出现。虽然这是预期的,但我理想情况下只需要为标题显示最新的价格变化。为了解决这个问题,我尝试使用标题'id'进行GROUPING(注意:上面的GROUP BY t.id)。不幸的是,虽然我希望GROUP尊重ORDER BY(订购DESC订单中的最新价格变化),结果似乎会删除最新的更改,并显示具有较早价格值的GROUP'd标题。

其次,有没有更好的方法来获取每个项目的最后价格(目前我抓住当前值,然后运行子查询来获取'last_value' - 它实际上代表当前价格变化之前的值)。目前我运行两个子查询:一个用于获取第二个到最后一个已知价格,另一个用于确保数据库中存在先前价格(否则将标题列为价格变化没有意义)。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这个怎么样:

SELECT titles.id, titles.name, titles.type, prices.value, MAX(prices.timestamp)
FROM titles, prices
WHERE prices.row_id = titles.id AND prices.country='US';

请注意,我没有安装MySQL,所以我无法尝试此查询。

[编辑:]我认为它不起作用'因为它将始终显示为所有项目输入的最后价格,因为它总是从价格表中选择最高时间戳,也许一群人会这样做,我现在真的很困,我不能直接思考;

[编辑2:]这个怎么样: (SELECT max(report_run_date)as maxdate,report_name      来自report_history      GROUP BY report_name)maxresults

SELECT titles.id, titles.name, titles.type, prices.value,
    (SELECT MAX(prices.timestamp) as maxtimestamp FROM prices GROUP BY prices.row_id)
FROM titles, prices
WHERE prices.row_id = titles.id AND prices.country='US';