如何在subselect中使用与MAX不同的区域

时间:2016-09-23 21:40:14

标签: sql db2 greatest-n-per-group

我需要选择不同的server_name,日期与database_size的SUM,其中我在子选择中执行MAX的database_size 我无法设法获得不同的server_names ..我的查询总是返回重复项(即使我的表没有重复值)

我的表

id  server_name        database_size   received_at
1   abcd@ca.abc.com      271254016   2016-04-28
2   alphabet@ca.alp.com  61739776   2016-05-03
3   defg@ca.some.com     61438464   2016-05-03
4   1234@some.com        280043520  2016-05-03

我想要的结果: note *日期是不同的,database_size是不同的,server_name是不同的 - 这些值都不应该相同。

abcd@ca.abc.com 271254016   2016-04-28
server2@ca.com  274209280   2016-04-29
server3@ca.com  268375040   2016-04-30
server4@ca.com  277126400   2016-05-01

我试过了这个问题: 这是不对的,我想要DISTINCT server_name(但是放DISTINCT没有帮助 - 它仍然返回相同的server_name)

select server_name, sum(data_size) as data_size, date from (select date(received_at) as date, sum(database_size) as data_size, 
server_name from schema.db_stats group by date(received_at), server_name) where  server_name like '%abc%' group by date, server_name order by date

但我明白了: 我多次获得server_name,我只希望server_name具有MAX_s量的database_size

abcd@ca.abc.com 271254016   2016-04-28
abcd@ca.abc.com 274209280   2016-04-29
abcd@ca.abc.com 268375040   2016-04-30
abcd@ca.abc.com 277126400   2016-05-01
abcd@ca.abc.com 277126400   2016-05-02
alphabet@ca.alp.com 61739776    2016-05-03
defg@ca.some.com    61438464    2016-05-03
1234@some.com       280043520   2016-05-03
有人可以帮忙吗?真的很感激。

1 个答案:

答案 0 :(得分:0)

我猜您使用的是Microsoft SQL Server,因为您标记了问题。将来,如果您使用您使用的SQL数据库标记问题将会很有帮助,因为它可以帮助人们回答该品牌的最佳解决方案。

我没有对此进行过测试,但我相信以下内容可以满足您的需求:

SELECT server_name, date, data_size
FROM (
    SELECT server_name, date,
      ROW_NUMBER() OVER (PARTITION BY server_name, date ORDER BY data_size DESC) AS RowNumber  
    FROM (
        SELECT server_name, DATE(received_at) AS date, SUM(database_size) as data_size,
        FROM schema.db_stats
        WHERE server_name LIKE '%abc%'
        GROUP BY server_name, DATE(received_at)
    )
)
WHERE RowNumber = 1;