2015-06-20 227 views
1

我现在有一个具有以下布局的价格表:MySQL查询返回MIN()和不同列的MAX()为多行

id codename price discount  timestamp 
1  1234  599  50   2015-06-10 00:00:00 
2  1234  1099  25   2015-06-11 00:00:00 
3  3344  199  33   2015-06-12 00:00:00 
4  5565  2499  0   2015-06-13 00:00:00 
5  5565  1299  50   2015-06-14 00:00:00 

我需要一个SQL查询,这将使我的单行为每个代码名称。每一行必须包含代号,然后以最低的价格(与相关的折扣和时间戳,这个价格一起),以及最新的时间戳(再次与相关的价格和折扣。时间戳)

所需的输出:

codename minTimePrice minTimeDis minTime    latestPrice latestPriceDis latestPriceTime 
1234  599   50   2015-06-10 00:00:00 1099   25    2015-06-11 00:00:00 
3344  199   33   2015-06-12 00:00:00 199   33    2015-06-12 00:00:00 
5565  1299   50   2015-06-14 00:00:00 1299   50    2015-06-14 00:00:00 

编辑:所以我得到的地方,我可以有2个独立的查询,可以得到该行与MIN(价格),第二个获得该行与MAX(时间戳),每个代号。

现在我需要做的是将它们连接在一起,以便它们都在同一行(按代号分组),如上例所示。

SQL Fiddle of 2 queries

+0

请问您可以给sqlfiddle链接 –

回答

0

尝试以下,

Select codename, minPrice, minDis, minTime, latestPrice, latestDis, latestTime from 
(
    Select T_Low.codename, minPrice, minDis, minTime, T_Latest.latestPrice, T_Latest.latestDis, T_Latest.latestTime from 
    (
     select * from (
    select row_number() over(partition by codename order by codename, price) row_id, codename, price as minPrice, discount as minDis, timestamp as minTime from 
     (
     select codename, discount, timestamp , min(price) as price from prices 
     group by codename, discount, timestamp 
     )T 
     ) T1 
     where row_id = 1 
    ) T_Low 
    left join 
    (
     select * from (
    select row_number() over(partition by codename order by codename, timestamp desc) row_id, codename, price as latestPrice, discount as latestDis, timestamp as latestTime from 
     (
     select codename, discount, timestamp , min(price) as price from prices 
     group by codename, discount, timestamp 
     )T 
     ) T1 
     where row_id = 1 
    )t_Latest 
    ON T_Low.codename= T_Latest.codename and T_Low.row_id = T_Latest.row_id 
)T 
order by codename 
+0

如果您解释为什么您的答案在原始不适用时可能会有所帮助 –

+0

在查询中使用了原始查询ID字段,而您想要执行分组时,总是唯一的必须被跳过。在查询中不必要的加入。请参阅我已更新的答案,它适用于所需的输出。 –

+0

以前的答案没有被我检查,只是基于假设,我已经测试过,你现在可以检查它。 –

0

所以经过一番摆弄加入我能拿到2个查询输出到每代号为单行:

SELECT * 
FROM 
(
    SELECT p.* 
    FROM prices p 
    JOIN 
    ( 
    SELECT codename, MIN(price) minPrice 
    FROM prices GROUP BY codename 
) p2 
    ON p.price = p2.minPrice AND p.codename = p2.codename 
) min 
LEFT JOIN 
(
    SELECT p.* 
    FROM prices p 
    JOIN 
    ( 
    SELECT codename, MAX(timestamp) maxTime 
    FROM prices GROUP BY codename 
) p2 
    ON p.timestamp = p2.maxTime AND p.codename = p2.codename 
) latest 
ON latest.codename = min.codename 

我我确信这个查询并不完美,但它确实给了我正在寻找的结果。

SQL Fiddle

如果有什么显着错,请让我知道,我可以更新。