Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server 2012中查找列中第一个非零值的行号_Sql Server - Fatal编程技术网

Sql server 如何在SQL Server 2012中查找列中第一个非零值的行号

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

我有一个表T1,其中包含countryid、stateid和Value列

我需要stateid值的行号,它对于每个国家都有第一个非零值。表中的数据按CountryId ASC、StateId ASC排序

我需要如下输出

对于countryid 1,我需要作为输出的行号应该是2。 对于countryid 2,我需要作为输出的行号应该是3。 对于countryid 3,我需要作为输出的行号应该是2。
可以使用分区来完成

;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