选择元组数最少的国家/地区

时间:2017-03-26 14:40:45

标签: sql sql-server

http://www.dofactory.com/sql/sandbox我正在尝试针对其示例数据库提交我自己的SQL查询,以便在SQL上变得更好。我想要做的是从Customer中选择所有具有最少元组数的国家/地区。这是我的查询尝试:

SELECT a.Country
FROM [Customer] a, (SELECT COUNT(*) AS Tot
FROM [Customer]
GROUP BY Country) b
GROUP BY a.Country
HAVING COUNT(*) = MIN(b.Tot)

然而,该网站返回一个空表而不是正确的结果(爱尔兰,挪威,波兰)。通过按国家/地区分组并使用COUNT(*),然后查看所有COUNT(*)值中COUNT(*)值最小的国家/地区,可以轻松实现正确的结果。关于如何在不对表格数据做任何假设的情况下生成正确的结果,我想提供一些建议。

3 个答案:

答案 0 :(得分:4)

我会使用SELECT TOP 1 WITH TIES执行此操作:

SELECT TOP 1 WITH TIES c.Country
FROM Customer c
GROUP BY c.Country
ORDER BY COUNT(*) ASC;

两个注释:

  • 使用表别名时,请将它们作为表的缩写。这使得查询更容易理解。
  • 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

答案 1 :(得分:1)

再次向Gordon Linoff学习了新的(WITH TIES)......

这是我没有它的解决方案......

Select a.Country from [Customer] a
group by a.Country
having count(*) =  (select min(b.Tot) from  (SELECT COUNT(*) AS Tot FROM [Customer] GROUP BY Country) b)

答案 2 :(得分:0)

如果您当时没有使用sql 2012,

声明@Fewer int = 2 ;用CTE作为 ( 选择c。* ,ROW_NUMBER()结束(按customerid的countryid顺序分区)rn 来自dbo.Customers C

从cte中选择* 其中rn< = @更少