【问题标题】:ROW_NUMBER() with BETWEEN SQL Server 2012ROW_NUMBER() 与 BETWEEN SQL Server 2012
【发布时间】:2015-08-11 19:13:11
【问题描述】:

我需要一些关于在 SQL Server 2012 中使用 ROW_NUMBER()BETWEEN 的指导。

我写了以下代码:

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 

目的是用 1 ELSE 0 标记那些 locationCode BETWEEN MIN(startDate) AND EndDate

我该怎么做?

我添加了一个表格:这就是它现在的样子

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 列的最后一行为零,因为它在 EndDate 之外。

【问题讨论】:

  • 你为什么要使用ROW_NUMBER
  • 我不确定还有什么其他方法可以解决我从今天早上开始一直在处理的问题。基本上,这就是我需要做的。如何编码,我觉得有点难。
  • 请提供示例。值通常总是大于或等于最小值,而且很难弄清楚 EndDate 是什么
  • 您将min(startdate)enddate 与什么进行比较?
  • 如何将LocationCodeDate 进行比较?这就是我正在努力解决的部分。

标签: sql sql-server sql-server-2012 row-number


【解决方案1】:

您不需要ROW_NUMBER()。您可以使用CROSS APPLY 来完成此操作。

根据您的示例数据,我假设这些字段的数据类型是 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

【讨论】:

    【解决方案2】:

    或者,您可以像这样进行简单的分组并加入表格:

    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;
    

    SQL Fiddle Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多