行号()在SQL Server 2012之间
我需要一些关于在SQL Server 2012中使用行号()在SQL Server 2012之间,sql,sql-server,sql-server-2012,row-number,Sql,Sql Server,Sql Server 2012,Row Number,我需要一些关于在SQL Server 2012中使用ROW_NUMBER()以及之间的的指导 我编写了以下代码: SELECT DISTINCT *, CASE WHEN (row_number() OVER BETWEEN (PARTITION BY LocationCode ORDER BY startdate ASC) AND EndDate) = 1 THEN 1
ROW_NUMBER()
以及之间的的指导
我编写了以下代码:
SELECT DISTINCT
*,
CASE WHEN (row_number() OVER BETWEEN (PARTITION BY LocationCode
ORDER BY startdate ASC) AND EndDate) = 1
THEN 1 ELSE 0
END AS Testr,
FROM
Table
其目的是在MIN(startDate)和EndDate
之间用1或0标记位置代码
我该怎么做
我添加了一个表:这就是它现在的样子
LocationCode StartDate EndDate
10808247 20140617 20140701
10808247 20140618 20140701
10808247 20140618 20140701
10808247 20140617 20140701
10808247 20140709 20140801
目标:
LocationCode StartDate EndDate New
10808247 20140617 20140701 1
10808247 20140618 20140701 1
10808247 20140618 20140701 1
10808247 20140617 20140701 1
10808247 20140709 20140801 0
列New
的最后一行为零,因为它不在结束日期之内,因此不需要行编号()。您可以通过交叉应用来实现这一点
基于示例数据,我假设这些字段的数据类型为INT
Select T.LocationCode, T.StartDate, T.EndDate,
Case When T.StartDate > X.MinEndDate Then 0 Else 1 End As New
From Table T
Cross Apply
(
Select Min(T2.EndDate) MinEndDate
From Table T2
Where T2.LocationCode = T.LocationCode
) X
或者,您可以执行简单的分组操作,并像下面这样连接回表:
SELECT T.LocationCode
,T.StartDate
,T.EndDate
,CASE
WHEN T.StartDate > t2.MinEndDate
THEN 0
ELSE 1
END AS New
FROM test T
INNER JOIN (
SELECT locationcode
,Min(EndDate) MinEndDate
FROM test
GROUP BY locationcode
) T2 ON T2.LocationCode = T.LocationCode;
为什么要使用行号
执行此操作?我不确定还有什么其他方法可以解决我从今天早上开始一直在处理的问题。基本上,这就是我所需要做的。如何编码它,我发现它有点难。请包括例子。值通常总是大于或等于最小值,并且很难确定结束日期是什么。您将min(startdate)
和EndDate
与什么进行比较?如何将LocationCode
与日期进行比较?这是我正在努力解决的问题。