我想按姓氏对表进行分区? [关闭]
Posted
技术标签:
【中文标题】我想按姓氏对表进行分区? [关闭]【英文标题】:I want to partition my table by the last name? [closed] 【发布时间】:2014-05-02 14:44:27 【问题描述】:我希望能够通过 C.LastName 计数然后对我的表进行分区。我只是在学习 SQL,并不能完全确定 COUNT(...) 行在程序中是如何工作的。
这是按 LastName 对表进行计数和分区的正确方法吗?
由于某种原因,SQL 中的这行代码似乎很难看出它是如何完全工作的。
select C.*,
COUNT(*) over (partition by c.LastName) as '--Count--'
from Customer C;
表:
PrimaryKey FirstName LastName MiddleName PhoneNumber Address1 Address2 City State Zipcode
1 Test1 LTest1 MTest1 5555555555 555 Governors 5555 Governors Avenue Pierre TT 99999
2 Test2 LTest2 MTest2 4444441234 444 Governors Street 4444 Governors Blvd Bill PP 44444
3 Test3 LTest3 MTest3 3333331234 333 Governors Street 3333 Governors Street Pop RR 33333
4 Test1 LTest1 MTest9 7777777777 77 Governors Avenue 7 Governors Street Yet UU 22222
10 FirstName LastNme MiddleName 8888888889 321 H Street 4321 U Street TownUSA VB 77777
11 NULL A NULL NULL NULL NULL NULL NULL NULL
12 NULL A NULL NULL NULL NULL NULL NULL NULL
13 NULL A LTest NULL HTest NULL NULL NULL NULL
14 Test14 LTest14 MTest14 1231231234 123 VVV Billings Billings NULL NULL
15 NULL NULL NULL NULL NULL NULL NULL NULL NULL
16 NULL A NULL NULL NULL NULL NULL NULL NULL
17 NULL A NULL NULL NULL NULL NULL NULL NULL
18 NULL A NULL NULL NULL NULL NULL NULL NULL
19 NULL test NULL NULL NULL NULL NULL NULL NULL
20 NULL NULL NULL 1 123 ave 123 ave NULL NULL NULL
客户表:
1 Test1 LTest1 MTest1 5555555555 555 Governors 5555 Governors Avenue Pierre TT 99999
2 Test2 LTest2 MTest2 4444441234 444 Governors Street 4444 Governors Blvd Bill PP 44444
3 Test3 LTest3 MTest3 3333331234 333 Governors Street 3333 Governors Street Pop RR 33333
4 Test1 LTest1 MTest9 7777777777 77 Governors Avenue 7 Governors Street Yet UU 22222
10 FirstName LastNme MiddleName 8888888889 321 H Street 4321 U Street TownUSA VB 77777
11 NULL A NULL NULL NULL NULL NULL NULL NULL
12 NULL A NULL NULL NULL NULL NULL NULL NULL
13 NULL A LTest NULL HTest NULL NULL NULL NULL
14 Test14 LTest14 MTest14 1231231234 123 VVV Billings Billings NULL NULL
15 NULL NULL NULL NULL NULL NULL NULL NULL NULL
16 NULL A NULL NULL NULL NULL NULL NULL NULL
17 NULL A NULL NULL NULL NULL NULL NULL NULL
18 NULL A NULL NULL NULL NULL NULL NULL NULL
19 NULL test NULL NULL NULL NULL NULL NULL NULL
20 NULL NULL NULL 1 123 ave 123 ave
NULL NULL NULL
新查询:
SELECT C.*,
A.B as "--Count--"
FROM Customer c
INNER JOIN
(
SELECT lastname,
count(*) as B
FROM customer
GROUP BY lastname
) A
ON c.lastname = A.lastname;
感谢您在下面向我展示此示例。 count(*) 是否为 B(我更改了一些变量只是为了让我可以看到你可以。A 和 B 不是很好的变量名。
count(*) as B 是否引用该 select 语句中的姓氏。这是我唯一不确定的说法。
【问题讨论】:
您的问题是什么?从语法上讲,您似乎走在了正确的轨道上。 你使用的是哪个 rdbms? Microsoft SQL 服务器管理工作室 我的问题是为什么SQL语句没有“编译”并运行。 【参考方案1】:如果您使用的是 mysql,则 COUNT(*) 不是受支持的分析函数。您可以使用以下查询获得相同的结果:
SELECT
C.*,
counts_lastname.cnt_lastname as "--Count--"
FROM Customer c
INNER JOIN
(
SELECT
lastname,
count(*) as cnt_lastname
FROM customer
GROUP BY lastname
) counts_lastname
ON c.lastname = counts_lastname.lastname;
参考文献:
Analytic functions: SUM, AVG, ROW_NUMBER on EXPLAIN EXTENDED blog
A related question on SO
【讨论】:
COUNT(*) over (partition by c.LastName) as '--Count--' 在 SQL Server 中将不起作用。 它在 SQL Server 中工作。请看这个小提琴 - sqlfiddle.com/#!6/3aada/6 你得到什么错误/输出? 我看了,它确实有效。【参考方案2】:如果您想计算姓氏相同的人,您的语法是正确的。那些窗口函数起初看起来有点令人生畏,但只是玩弄它,看看你的结果,你应该没问题。您发布问题的事实表明您得到了与预期不同的结果,对吗?
编辑: 我匆忙下结论并假设 sqlserver...
【讨论】:
以上是关于我想按姓氏对表进行分区? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章