使用SQL查找最流行和最独特的记录

时间:2013-08-29 02:14:46

标签: sql ms-access

我妈妈想为我兄弟的婴儿洗澡买一个婴儿游戏。想要学习python,我自告奋勇去做。我几乎有python位,这就是抛出我的SQL。

游戏应该起作用的方式是淋浴时每个人都在纸上写下名字,我手动将它们输入Excel(尽可能规范拼写)并导出到MS Access。然后我运行我的python程序,找到最流行名字的玩家和名字最独特的玩家。这个名为“babynames”的数据库只有四列。

ID | BabyFirstName | BabyMiddleName | PlayerName
---|---------------|----------------|-----------

我的妈妈经常改变一切,但正如他们现在所说的那样,我必须弄明白:

a)所有名字和中间名称中最流行的名字(或名称,如果有领带)

b)所有名字和中间名称中最独特的名字(或名称,如果有领带)

c)拥有最多流行名字(赢得奖品)的玩家

d)拥有最多唯一名称(赢得奖品)的玩家

我一直在研究这个问题大约一个星期,甚至不能得到a)和b)工作的SQL查询,更不用说c)和d)。我不仅仅是有点沮丧。

顺便说一句,我只是看着名字的拼写,而不是语音。当我手动输入名字时,我会将“Kris”等名称改为“Chris”,将“Xtina”改为“Christina”等。

编辑以添加我尝试过的几个最新查询a)

SELECT [BabyFirstName], 
       COUNT ([BabyFirstName]) AS 'FirstNameOccurrence' 
FROM [babynames] 
GROUP BY [BabyFirstName] 
ORDER BY 'FirstNameOccurrence' DESC 
LIMIT 1

SELECT [BabyFirstName] 
FROM [babynames] 
GROUP BY [BabyFirstName] 
HAVING COUNT(*) = 
    (SELECT COUNT(*) 
     FROM [babynames] 
     GROUP BY [BabyFirstName] 
     ORDER BY COUNT(*) DESC 
     LIMIT 1)

这两者都会导致语法错误。

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause. (-3508) (SQLExecDirectW)')

我尝试使用[FirstNameOccurrence]和FirstNameOccurrence以及相同的错误。不确定为什么它不能通过该列名来识别它。

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error. in query expression 'COUNT(*) = (SELECT COUNT(*) FROM [babynames] GROUP BY [BabyFirstName] ORDER BY COUNT(*) DESC LIMIT 1)'. (-3100) (SQLExecDirectW)")

我承认我在这里并没有真正学习所有的COUNT(*)命令,但这是针对stackoverflow中类似问题的解决方案,我认为当我的其他想法没有时我会尝试平底锅。

2 个答案:

答案 0 :(得分:0)

对于A和B,在SQL中使用group by子句,然后计数,order by计数。使用A的降序和B的升序,只取每个的第一个结果。

对于C和D,基本上使用相同的策略,但现在只需添加PlayerName(例如group by babyname,playername),然后使用升序/降序问题。

以下是微软对MS Access中group by子句的撰写:https://office.microsoft.com/en-us/access-help/group-by-clause-HA001231482.aspx

这是一篇更好的文章,展示了如何同时执行group byorder byhttp://rogersaccessblog.blogspot.com/2009/06/select-queries-part-3-sorting-and.html

答案 1 :(得分:0)

对于您尝试的第一个查询,请将其更改为:

SELECT TOP 1 [BabyFirstName], 
       COUNT ([BabyFirstName]) AS 'FirstNameOccurrence' 
FROM [babynames] 
GROUP BY [BabyFirstName] 
ORDER BY 'FirstNameOccurrence' DESC

对于第二个,将其更改为:

SELECT [BabyFirstName] 
FROM [babynames] 
GROUP BY [BabyFirstName] 
HAVING COUNT(*) = 
    (SELECT TOP 1 COUNT(*) 
     FROM [babynames] 
     GROUP BY [BabyFirstName] 
     ORDER BY COUNT(*) DESC)

通过在TOP之后直接添加SELECT语句来限制Access中SQL语句返回的记录数,而不是ORDER BY... LIMIT

此外,Access TOP语句将返回前n个(或n%)唯一记录的所有实例,因此如果查询输出中有两个或更多相同的记录(在TOP之前),并且{{1如果已指定,您将全部看到它们。