我有一个简单的表,用于记录在线广播电台的客户端连接。我正在尝试提出一种观点,该观点将根据整个时段的收听时间返回前10个国家/地区,但按日期和日期分组。

需要说明的是,前10名将是整个时期的前10名,而不仅仅是每天。例如,美国可能一直以来都是我们排名第一的国家,但是有时它可能会下降到12个国家,但我仍然需要每天列出整个前10个国家。

实际上,这应该产生一个视图,每天在哪里会有相同的十个国家/地区,但总收听时间为。

我创建了一个返回所有国家的视图:

SELECT DATE( datetime_end ) , country_code, SUM( duration ) /3600
FROM icecast_logs
WHERE mount = 'live'
GROUP BY DATE( datetime_end ) , country_code

最佳答案

对于MSSQL,使用TOP

SELECT TOP 10 DATE(datetime_end), country_code, SUM(duration)/3600
FROM icecast_logs
WHERE mount = 'live'
GROUP BY DATE(datetime_end), country_code
ORDER BY SUM(duration)/3600 DESC


对于MySQL,请使用LIMIT

SELECT DATE(datetime_end), country_code, SUM(duration)/3600
FROM icecast_logs
WHERE mount = 'live'
GROUP BY DATE(datetime_end), country_code
ORDER BY SUM(duration)/3600 DESC
LIMIT 10


对于Oracle,您需要使用RANKROWNUM

WITH  top_icecast_logs AS
(
    SELECT DATE(datetime_end) AS Dateend, country_code, SUM(duration)/3600 AS SumTotalAmount,
    RANK () OVER (ORDER BY SUM (SumtotalAmount) DESC) AS tsum
    FROM icecast_logs
    GROUP BY DATE(datetime_end), country_code
)
SELECT    Dateend, country_code, SumTotalAmount
FROM      top_icecast_logs
WHERE     tsum <= 2
ORDER BY  SumTotalAmount DESC;

关于mysql - 根据全部数据的总数(按日期分组)选择前10名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31959806/

10-11 18:20