【问题标题】:How to run Row_Number() with filtering如何使用过滤运行 Row_Number()
【发布时间】:2019-08-19 01:13:35
【问题描述】:

我有一个表格,每个“案例编号”都有多行。我想为每个案例编号选择一行并将其连接回另一个表,保持一对一的关系。

选择这一行的条件是:

1) 首先过滤掉每个 Case Number 的 Stage = Cancelled 的所有行

2) 如果您发现 Stage = 'In Progress' 或 'Paused',请选择该行。 (案例编号只能出现这两个中的一个)

3) 如果不是 (2),则选择 Stage = 'Completed',但选择最新的 'Stop Time'。 (这就是我认为我们可能必须使用 ROW_NUMBER() 的地方)

我已经创建了一个查询来推送行号并根据最新的“停止时间”选择一行,但我无法弄清楚如何在其中添加上述过滤器和 if-else 条件.

    SELECT  [Case Number],
ROW_NUMBER ( )  
    OVER ( PARTITION BY [Case Number] order by [Stop time] desc )  idx
      ,[Stage]
      ,[Time left]
      ,[SLA definition]
      ,[Elapsed time]
      ,[Elapsed percentage]
      ,[Start time]
      ,[Stop time]
      ,[Has breached]
      ,[Breach time]
      ,[Updated]
      ,[Updated by]
      ,[Created]
      ,[Created by]


  FROM ( select * from [SLA_Data] where Stage != 'Cancelled' )v1

【问题讨论】:

  • 您的查询距离很远,如果我们能看到一些示例数据,您的问题会更容易理解。
  • @TimBiegeleisen - 我已经发布了我能够编写的满足条件 1 的最新查询。不幸的是,我无法发布任何数据,因为这是机密数据。
  • 或许可以重新考虑这个决定,因为除了完全缺乏数据之外,这似乎是一个有趣的问题。
  • 你考虑过dense_rank()函数吗? ROW_NUMBER 将为找到的指定分区的每个实例提供一个增量,如果您使用 dense_rank()over(order by task order),那么您应该会看到每个 taskorder 的唯一增量条目。
  • 为什么您的选择语句中缺少案例编号?

标签: sql tsql row-number


【解决方案1】:

从您的问题中很难判断,但这是我的解释(我无法访问 SQL,您也没有提供足够的测试数据,因此无法对其进行测试)

   select * from
    ( 
    SELECT  [Task],...,...,
    ROW_NUMBER ( )      
    OVER ( PARTITION BY Task order by 
        case 
        when Stage in('In Progress' ,'Paused') then 1
        when Stage='Completed' then 2 end,
        [Stop time] desc )  idx
    ) 
    where idx=1

【讨论】:

  • 这似乎工作正常,我正在验证数据。你能告诉我'case'语句中'then'之后的'1'和'2'在做什么吗?
  • 他们给你点东西。如果它正在进行或暂停,则 1,完成 2。按该编号排序。这是一种将您的奇特订单需求简单化的方法。如果还是不明白,可以将CASE 放到类似的SELECT 语句中,看看发生了什么。
  • 它在同时按两件东西排序的意义上是否有效?首先按阶段,然后按停止时间?它给了我正确的结果,但我希望能非常清楚地了解它是如何工作的。
  • 正确。您的进行中和暂停也将按停止时间进行二级排序 - 我认为这无关紧要。
  • 没有!惊人的!不过,我还有一个问题要问你。如果从这些票中,我想过滤掉“开始时间”的所有条目都相同的票,该怎么办。我如何在这里实现它?
【解决方案2】:

假设 Case_Number 存在于下表中或当前表必须与 Case_Number 表连接

,则以下代码应该可以工作
create view [dbo].[SLA_View] as select * from (

SELECT * FROM
(
SELECT  [Task]
      ,[Stage]
      ,[Time left]
      ,[SLA definition]
      ,[Elapsed time]
      ,[Elapsed percentage]
      ,[Start time]
      ,[Stop time]
      ,[Has breached]
      ,[Breach time]
      ,[Updated]
      ,[Updated by]
      ,[Created]
      ,[Created by]
FROM
(
/* GETS SINGLE CASE FOR MULTIPLE STAGES */
SELECT *,ROW_NUMBER ( )  OVER ( PARTITION BY Task order by [Stage] desc)  RNK
 FROM [SLA_Data] WHERE [CASE_NUMBER] IN 
(
/* GETS DISTINCT CASE NUMBER WITH STAGE = 'PAUSED' OR 'IN PROGRESS' */
SELECT DISTINCT [CASE_NUMBER]
  FROM [SLA_Data]
  WHERE [Stage] != 'Cancelled'
  AND [Stage] IN ('Paused','In Progess')
  GROUP BY  [CASE_NUMBER]
  HAVING COUNT(*) >= 1
  )
  )Y
  WHERE RNK = 1
)Z
UNION
SELECT [Task]
      ,[Stage]
      ,[Time left]
      ,[SLA definition]
      ,[Elapsed time]
      ,[Elapsed percentage]
      ,[Start time]
      ,[Stop time]
      ,[Has breached]
      ,[Breach time]
      ,[Updated]
      ,[Updated by]
      ,[Created]
      ,[Created by]
      FROM
      (
      SELECT *, ROW_NUMBER ( )  OVER ( PARTITION BY Task order by [start time] desc)  idx
      FROM [SLA_Data]
      WHERE [CASE_NUMBER] NOT IN (
      SELECT DISTINCT [CASE_NUMBER]
  FROM [SLA_Data]
  WHERE [Stage] != 'Cancelled'
  AND [Stage] IN ('Paused','In Progess')
  GROUP BY  [CASE_NUMBER]
  HAVING COUNT(*) > 1
  )
)v1 where idx = 1
)

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2014-11-17
    • 2016-11-04
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多