Sql server 如何在SQL Server 2012中查找列中第一个非零值的行号
我有一个表T1,其中包含countryid、stateid和Value列 我需要stateid值的行号,它对于每个国家都有第一个非零值。表中的数据按CountryId ASC、StateId ASC排序 我需要如下输出 对于countryid 1,我需要作为输出的行号应该是2。 对于countryid 2,我需要作为输出的行号应该是3。 对于countryid 3,我需要作为输出的行号应该是2。Sql server 如何在SQL Server 2012中查找列中第一个非零值的行号,sql-server,Sql Server,我有一个表T1,其中包含countryid、stateid和Value列 我需要stateid值的行号,它对于每个国家都有第一个非零值。表中的数据按CountryId ASC、StateId ASC排序 我需要如下输出 对于countryid 1,我需要作为输出的行号应该是2。 对于countryid 2,我需要作为输出的行号应该是3。 对于countryid 3,我需要作为输出的行号应该是2。 可以使用分区来完成 ;With CTE_T1 As ( Select Coun
可以使用分区来完成
;With CTE_T1 As
(
Select
CountryID, StateID, Value,
Row_Number Over (Partition By CountryID Order By Value) As RK
From
T1
Where
IsNull(Values, 0) <> 0
)
Select *
From CTE_T1
Where RK = 1
如果存在多个非零值,分区中的order by子句将用于选择记录。根据OP中所述的所需结果集进行猜测,以下查询将返回每个countryid所需的“行数”:
WITH FormattedT1 AS
(
SELECT Countryid, Stateid, Value, ROW_NUMBER() OVER(PARTITION BY Countryid ORDER BY ...) AS num
FROM T1
WHERE Value > 0
)
SELECT Countryid, Stateid, Value
FROM FormattedT1
WHERE num = 1
你怎么知道你把每个国家都算进去了?每个国家能有多个非零值吗?什么构成第一个非零值?我们可以假设我们是按StateId排序的吗?是的,每个国家可以有多个非零值。您首先如何定义?最低的州号?最高的?表中的一些信息您没有显示?有些信息无法从表中的数据推断出来?这里没有行号,除非您可以根据数据定义行号。否则,一张桌子就是一袋杂乱无章的行。那么,让我们再试一次:您想要具有非零值的最低stateid吗?如果3/34在3/32之前插入或出现,该怎么办?然后呢?使用您要排序的列。这将取决于业务逻辑。否则,只需添加countryid即可抵消效果。
WITH FormattedT1 AS
(
SELECT Countryid, Stateid, Value, ROW_NUMBER() OVER(PARTITION BY Countryid ORDER BY ...) AS num
FROM T1
WHERE Value > 0
)
SELECT Countryid, Stateid, Value
FROM FormattedT1
WHERE num = 1
SELECT countryid, MIN(rn) AS rn
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY countryid
ORDER BY stateid) AS rn
FROM T1 ) t
WHERE Value <> 0
GROUP BY countryid
countryid rn
---------------
1 2
2 3
3 2