簡體   English   中英

查詢獲取MAX值和對應的日期

[英]Query to get MAX value and corresponding date

桌子

+---------------------+-----------------------------+--------------+----------+
| timestamp           | hostname                    | LICENSECOUNT | MAX_USED |
+---------------------+-----------------------------+--------------+----------+
| 2021-02-03 17:00:03 | server1                     |          125 |      10  |
| 2021-02-03 17:00:06 | server2                     |          415 |      50  |
| 2021-02-26 18:00:07 | server1                     |          125 |      125 |
| 2021-02-26 18:00:09 | server2                     |          415 |      415 |
| 2021-03-05 17:00:02 | server1                     |          125 |      115 |
| 2021-03-05 17:00:04 | server2                     |          415 |      315 |

我的查詢- 獲取過去 30 天內按服務器分組的許可證計數的最大值

select 
    timestamp, hostname, LICENSECOUNT, max(currentused) as MAX_USED 
from 
    LICENSECHECKS 
where 
    TIMESTAMP BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW() 
group by hostname;

我的結果- 時間戳是數據集的開始(30 天前)

+---------------------+-----------------------------+--------------+----------+
| timestamp           | hostname                    | LICENSECOUNT | MAX_USED |
+---------------------+-----------------------------+--------------+----------+
| 2021-02-03 17:00:03 | server1                     |          125 |      125 |
| 2021-02-03 17:00:06 | server2                     |          415 |      415 |

我想要的結果- 時間戳對應於日期

+---------------------+-----------------------------+--------------+----------+
| timestamp           | hostname                    | LICENSECOUNT | MAX_USED |
+---------------------+-----------------------------+--------------+----------+
| 2021-02-26 18:00:07 | server1                     |          125 |      125 |
| 2021-02-26 18:00:09 | server2                     |          415 |      415 |

在子查詢 select 語句中添加以下內容

 ROW_NUMBER() OVER (PARTITION BY hostname ORDER BY currentuserid DESC) as RN

然后在外部查詢 where 語句中提取 RN = 1 的行

您可以使用:

select lc.*
    timestamp, hostname, LICENSECOUNT, max(currentused) as MAX_USED 
from LICENSECHECKS 
where lc.currentused = (select max(lc2.currentused)
                        from licensechecks lc2
                        where lc2.timestamp >= now() - interval 30 day and
                              lc2.hostname = lc.hostname
                       );

筆記:

  • 這假定沒有未來的timestamps
  • 如果有重復的最大值(可以通過調整來處理),這將返回重復項。
  • now()有一個時間組件。 我懷疑您可能想要curdate() - interval 29 day類的東西。

暫無
暫無

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

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