SQLite 查询每种类型的最高消费者

SQLite query for Top spender in each genre

我正在使用基本的 chinook 数据库,但我不知道如何编写 SQLite 查询来为花费最多(基于数量 * 单价)的客户(命名为 TopSpender)创建一个名为 topCustomers 的视图,命名为 TotalSpending)在每种音乐类型上的销量。列:类型、TopSpender、TotalSpending

专辑 table 的架构:

 [Title] NVARCHAR(160)  NOT NULL,
 [ArtistId] INTEGER  NOT NULL,
 FOREIGN KEY ([ArtistId]) REFERENCES "artists" ([ArtistId])

艺术家table:

[ArtistId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[Name] NVARCHAR(120)

轨道 table 架构:

 [TrackId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Name] NVARCHAR(200)  NOT NULL,
    [AlbumId] INTEGER,
    [MediaTypeId] INTEGER  NOT NULL,
    [GenreId] INTEGER,
    [Composer] NVARCHAR(220),
    [Milliseconds] INTEGER  NOT NULL,
    [Bytes] INTEGER,
    [UnitPrice] NUMERIC(10,2)  NOT NULL,
    FOREIGN KEY ([AlbumId]) REFERENCES "albums" ([AlbumId])
                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([GenreId]) REFERENCES "genres" ([GenreId])
                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([MediaTypeId]) REFERENCES "media_types" ([MediaTypeId])
                ON DELETE NO ACTION ON UPDATE NO ACTION

table invoice_items:

    [InvoiceLineId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [InvoiceId] INTEGER  NOT NULL,
    [TrackId] INTEGER  NOT NULL,
    [UnitPrice] NUMERIC(10,2)  NOT NULL,
    [Quantity] INTEGER  NOT NULL,
    FOREIGN KEY ([InvoiceId]) REFERENCES "invoices" ([InvoiceId])
                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([TrackId]) REFERENCES "tracks" ([TrackId])
                ON DELETE NO ACTION ON UPDATE NO ACTION

客户table:

    [CustomerId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [FirstName] NVARCHAR(40)  NOT NULL,
    [LastName] NVARCHAR(20)  NOT NULL,
    [Company] NVARCHAR(80),
    [Address] NVARCHAR(70),
    [City] NVARCHAR(40),
    [State] NVARCHAR(40),
    [Country] NVARCHAR(40),
    [PostalCode] NVARCHAR(10),
    [Phone] NVARCHAR(24),
    [Fax] NVARCHAR(24),
    [Email] NVARCHAR(60)  NOT NULL,
    [SupportRepId] INTEGER,
    FOREIGN KEY ([SupportRepId]) REFERENCES "employees" ([EmployeeId])
                ON DELETE NO ACTION ON UPDATE NO ACTION

发票table:

[InvoiceId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [CustomerId] INTEGER  NOT NULL,
    [InvoiceDate] DATETIME  NOT NULL,
    [BillingAddress] NVARCHAR(70),
    [BillingCity] NVARCHAR(40),
    [BillingState] NVARCHAR(40),
    [BillingCountry] NVARCHAR(40),
    [BillingPostalCode] NVARCHAR(10),
    [Total] NUMERIC(10,2)  NOT NULL,
    FOREIGN KEY ([CustomerId]) REFERENCES "customers" ([CustomerId])
                ON DELETE NO ACTION ON UPDATE NO ACTION

我还有所有其他 table。

albums          employees       invoices        playlists
artists         genres          media_types     tracks
customers       invoice_items   playlist_track

感谢任何帮助。

加入表格并汇总以获得每个 genre/customer 的总支出。
然后使用 FIRST_VALUE()MAX() window 函数获取每个类型中的最高消费者:

CREATE VIEW topCustomers AS
SELECT DISTINCT 
       g.Name Genre, 
       FIRST_VALUE(c.LastName || ' ' || c.FirstName) OVER (PARTITION BY g.GenreId ORDER BY SUM(ii.Quantity * ii.UnitPrice) DESC) TopSpender,
       MAX(SUM(ii.Quantity * ii.UnitPrice)) OVER (PARTITION BY g.GenreId) TotalSpending
FROM genres g
INNER JOIN tracks t ON t.GenreId = g.GenreId
INNER JOIN invoice_items ii ON ii.TrackId = t.TrackId
INNER JOIN invoices i ON i.InvoiceId = ii.InvoiceId
INNER JOIN customers c ON c.CustomerId = i.CustomerId
GROUP BY g.GenreId, i.CustomerId;