使用列组合获取最大数量

时间:2014-01-28 13:55:36

标签: sql sql-server performance optimization

我的表格包含AutoID,Number,Name,City,State,Country等列。

我想要的是在“数字”列中输入的最大数字,其中包含名称,城市,州和国家/地区。

示例:

Name     City     State     Country
Smith    NY      NY         USA
John     NY       NY        USA
John     NJ       NY        USA

现在史密斯应该得到“数字”1,约翰2,再次约翰(新泽西州)1,因为他是新泽西州的第一个。

我可以简单地在查询中放置一个where子句并获取最大数字+ 1.但问题是当我有大量数据并且用户数量增加时,我的查询会非常慢。我也在同一个表中插入数据,以便继续打桩。

我希望我已经清楚了。

Vipul Parekh

5 个答案:

答案 0 :(得分:1)

我猜这是你想要的:

Name     City     State     Country    Number
Smith    NY      NY         USA           1
John     NY       NY        USA           2
John     NJ       NY        USA           1

这是由row_number()

提供的
select name, city,state, country,
       row_number() over (partition by city, state, country order by (select null)) as Number
from table t;

请注意,群组中Number的排序是任意的,因为您没有提供idcreatedat列。不能保证它与表的顺序相同,因为SQL表本质上是无序的。

答案 1 :(得分:0)

您可以在桌面上创建触发器。无论何时插入一行,它都会计算行数并使用count + 1更新最新的行。

要缓慢行事,您可以在名称,城市,州和国家/地区创建索引。

如果您需要示例代码或一些指示,请告诉我。

答案 2 :(得分:0)

您可以使用ROW_NUMBER

SELECT * FROM
(
Select Name, 
       City, 
       State, 
       Country,
       Row_Number() over (Partition by City, State, Country ORDER BY Name) AS Number
From table1
) AS T

WORKING FIDDLE

答案 3 :(得分:0)

1) WITH Optimize_CTE(id,cityid,stateid,countryid) AS

- 定义CTE查询。 (

SELECT id,  cityid,stateid, countryid
FROM Optimize
WHERE id IS NOT NULL

- 定义引用CTE名称的外部查询。

SELECT id, 将(Varchar(255),cityid)转换为CityId, 将(Varchar(255),stateid)转换为StateId, 将(Varchar(255),countryid)转换为CountryId 来自Optimize_CTE选项(MAXRECURSION 1)

答案 4 :(得分:0)

DECLARE @RowsPerPage INT = 10,@ PageNumber INT = 1

SELECT InvoiceID,CustomerID

FROM dbo.SalesInvoice

ORDER BY InvoiceID

OFFSET(@ PageNumber-1)* @ RowsPerPage ROWS

FETCH NEXT @RowsPerPage仅限行

GO