2017-04-02 60 views
1

我已经写了一个查询,显示的原因,人们每年每取消国家他们的订单的入选理由量:哪个给出了这样的结果ATM如何选择count()的最高值?

SELECT DISTINCT LEFT(k.wijk,2) AS state, 
     YEAR(a.eind_dt) AS year, 
     opzegreden AS reason, 
     count(*) AS amount 
FROM  klant AS k 
JOIN  abon AS a 
ON  k.klant_id = a.lezer 
WHERE opzegreden IS NOT NULL 
GROUP BY LEFT(k.wijk,2), year(a.eind_dt), opzegreden 
ORDER BY state, year, reason; 

Current result

现在唯一我似乎无法做到的事情是显示每年每州最多选择的原因。这与我目前的结果是一致的。

有人可以帮我吗?

+0

你应该抛出,一些样本数据。如果我使用的分区函数在我的查询,那么为什么我必须使用GROUP BY,顺序按etc.Also“储值像‘k.wijk作为国家’是坏主意你应该直接将商店标识存储在表格中。 – KumarHarsh

回答

1

可以配对top with ties与窗函数row_number,每个国家每年最多数量来获得行。

select top 1 with ties LEFT(k.wijk, 2) as state, 
    YEAR(a.eind_dt) as year, 
    opzegreden as reason, 
    count(*) as amount 
from klant as k 
join abon as a on k.klant_id = a.lezer 
where opzegreden is not null 
group by LEFT(k.wijk, 2), 
    year(a.eind_dt), 
    opzegreden 
order by row_number() over (
     partition by state, year order by amount desc 
     ); 
+0

哦,哇,这个作品完美无缺。 –

0

你可以试试这个: -

SELECT 
     state, 
     year, 
     reason, 
     max(amount) 
    FROM 
    (
    SELECT DISTINCT LEFT(k.wijk,2) AS state, 
    YEAR(a.eind_dt) AS year, 
    opzegreden AS reason, count(*) AS amount 
    FROM klant AS k 
    JOIN abon AS a 
    ON k.klant_id = a.lezer 
    WHERE opzegreden IS NOT NULL 
    GROUP BY LEFT(k.wijk,2), year(a.eind_dt), opzegreden 
    ORDER BY state, year, reason 
    ) d 
GROUP BY 
    state, 
    year, 
    reason;