我想按姓氏对表进行分区? [关闭]

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...

【讨论】:

以上是关于我想按姓氏对表进行分区? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

数据库或英文名字和姓氏列表[关闭]

数据库或英文名字和姓氏列表[关闭]

如何按日期时间列对表进行分区?

是否可以使用 JetBrains DataGrip 对表进行分区? (PostgreSQL)

使用 Firebase 订购 [关闭]

在c#中对数组进行排序[关闭]