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;
我正在使用基本的 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;