簡體   English   中英

如何選擇具有MAX(datetime)的行並獲取列的最小值?

[英]How do I select rows with MAX(datetime) and also get min values for a column?

我的表是這樣的(np_capacity):

id  tower  datetime             capacity
---|----|---------------------|----------
1  | A  | 2016-05-29 09:02:41 | 34676
2  | B  | 2016-05-29 09:02:41 | 10736
5  | C  | 2016-05-29 09:02:41 | 55664
3  | D  | 2016-05-29 09:02:41 | 32622
4  | A  | 2016-05-29 13:08:38 | 5474
6  | B  | 2016-05-29 13:08:38 | 20692
7  | C  | 2016-05-29 13:08:38 | 134802
8  | D  | 2016-05-29 13:08:38 | 4754

我想選擇所有具有最大日期的塔,然后為這些塔選擇表中的最小容量值。

結果將是:

id  tower  datetime             capacity   MinCapacity
---|----|---------------------|----------|-------------
4  | A  | 2016-05-29 13:08:38 | 5474     | 5474
6  | B  | 2016-05-29 13:08:38 | 20692    | 10736
7  | C  | 2016-05-29 13:08:38 | 134802   | 55664
8  | D  | 2016-05-29 13:08:38 | 4754     | 4754

我所擁有的是這個,但它並不總是能給出正確的最小值。

SELECT npc.*, groupedcap.MinCapacity
FROM np_capacity npc
INNER JOIN
(SELECT tower, MAX(date) AS MaxDate
FROM np_capacity
GROUP BY tower) groupednpc 
ON npc.tower = groupednpc.tower 
INNER JOIN 
(SELECT tower, MIN(capacity) AS MinCapacity
FROM np_capacity
GROUP BY tower) groupedcap 
ON npc.tower = groupedcap.tower 
AND npc.date = groupednpc.MaxDate

您可以使用子選擇來計算最小容量和最大日期。 然后,與表聯接以獲取其他字段。

select npc.*, calc.minCapacity
from (
    select tower, max(datetime) maxDate, min(capacity) minCapacity
    from np_capacity
    group by tower
) calc
join np_capacity npc on (npc.tower = calc.tower
                         and npc.datetime = npc.maxDate)

該請求選擇所有塔,並選擇每個塔的最大日期時間和最小容量。

如果只需要具有maxdatetime的塔,則可以使用:

select npc.*, (select min(c2.capacity) from np_capacity c2 
               where c2.tower = npc.tower) minCapacity
from (select max(datetime) maxDatetime from np_capacity) c1
join np_capacity npc on (npc.datetime = c1.maxDatetime)
SELECT `a`.`id`,`a`.`tower`,`a`.`datetime`,`a`.`capacity`,(SELECT MIN(`b`.`capacity`) 
FROM `np_capacity` `b` WHERE `b`.`tower`=`a`.`tower` ) AS `MinCapacity` FROM `np_capacity` `a` 
WHERE `a`.`datetime`=(SELECT MAX(`datetime`) FROM `np_capacity`);

SQL Fiddle上測試以上查詢

另一個答案是在子查詢中使用order by和limit 1:

select t1.*,(select capacity from np_capacity t3 
  where t1.tower=t3.tower 
  order by capacity limit 1) mincapacity  
  from np_capacity t1 where  
 datetime=(select datetime from np_capacity
  order by datetime desc limit 1);

sqlfiddle測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM