久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

根據標志對計數遞增的記錄進行分組

Group records with incrementing count based on flag(根據標志對計數遞增的記錄進行分組)
本文介紹了根據標志對計數遞增的記錄進行分組的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

拿兩個...

實際數據:

division    ID          date            flag
ABC123      ZZZ123      1/17/2013       Y
ABC123      ZZZ123      1/25/2013       N
ABC123      ZZZ123      2/22/2013       Y
ABC123      ZZZ123      2/26/2013       N
ABC123      YYY222      3/20/2013       Y
ABC123      YYY222      5/17/2013       N
XYZ456      ZZZ999      1/15/2012       N
XYZ456      ZZZ999      1/30/2012       N
XYZ456      ZZZ123      2/09/2012       N
XYZ456      ZZZ123      4/13/2012       Y
XYZ456      ZZZ123      6/23/2012       N
XYZ456      ZZZ123      10/5/2012       Y
XYZ456      ZZZ123      11/18/2012      N

我需要構建一個新列 ORDER_group,它將根據以下規則進行填充:

I need to build a new column, ORDER_group, that will populate based on the following rules:

  • 每個部門和 ID 組合都被視為一個組",按日期排序,并應為其分配一個 ORDER_group(從 1 開始).
  • 每次組"遇到標志Y"時,它應該將 ORDER_group 增加 1.
  • 如果組"以標志 =N"開始(具有最早日期的第一條記錄),它仍應以 ORDER_group = 1 開始.
  • 如果組"以標志 =Y"開始(具有最早日期的第一條記錄),它仍應以 ORDER_group = 1 開始.
  • 每個后續記錄都應該是相同的 ORDER_group 編號,除非遇到新的組"(部門/ID),此時,它應該重置回 1,或者遇到下一個標志 =Y".

預期結果:

division    ID          date            flag    ORDER_group
ABC123      ZZZ123      1/17/2013       Y       1
ABC123      ZZZ123      1/25/2013       N       1
ABC123      ZZZ123      2/22/2013       Y       2
ABC123      ZZZ123      2/26/2013       N       2
ABC123      YYY222      3/20/2013       Y       1
ABC123      YYY222      5/17/2013       N       1
XYZ456      ZZZ999      1/15/2012       N       1
XYZ456      ZZZ999      1/30/2012       N       1
XYZ456      ZZZ123      2/09/2012       N       1
XYZ456      ZZZ123      4/13/2012       Y       2
XYZ456      ZZZ123      6/23/2012       N       2
XYZ456      ZZZ123      10/5/2012       Y       3
XYZ456      ZZZ123      11/18/2012      N       3

理想情況下,這應該在沒有循環/游標的情況下完成,除非有 CTE/臨時表的性能原因.填充此新列的最佳方法是什么?

Ideally this should be accomplished without a loop/cursor, unless there are performance reasons with CTE/temp tables. What is the best way to populate this new column?

任何幫助將不勝感激.

實際數據的 SQL Fiddler:http://sqlfiddle.com/#!3/5cca0/2

SQL Fiddler for Actual data: http://sqlfiddle.com/#!3/5cca0/2

推薦答案

所以這里有一個方法.它基于 How do I在不使用游標的情況下在 SQL 中計算運行總數? 這確實有一些缺陷.我在建議中使用索引,它可以使排序解決盡管更新順序無法保證的事實.

So here a way to do it. It based on How do I calculate a running total in SQL without using a cursor? which does have some flaws. I'm using an index on the advice that it makes the ordering work out DESPITE the fact that order on the update is not guaranteed.

另外值得指出的是計算運行總額/運行余額 用于 Aaron Bertrand 治療.

And it also worth pointing you to Calculate running total / running balance for Aaron Bertrand treatment.

這里可能很聰明的一點是將 Y/N 轉換為 1/0 以用于計算.

The possibly clever bit here is the conversion of Y/N to 1/0 for use in calculating.

CREATE TABLE Orders (division CHAR(6),ID CHAR(6),dat DATETIME, flag CHAR(1))
INSERT INTO Orders VALUES

('ABC123','ZZZ123','01/17/2013','Y')
,('ABC123','ZZZ123','01/25/2013','N')
,('ABC123','ZZZ123','01/25/2013','N')
,('ABC123','ZZZ123','01/25/2013','N')
,('ABC123','ZZZ123','01/25/2013','N')
,('ABC123','ZZZ123','02/22/2013','Y')
,('ABC123','ZZZ123','02/26/2013','N')
,('ABC123','YYY222','03/20/2013','Y')
,('ABC123','YYY222','05/17/2013','N')
,('XYZ456','ZZZ999','01/15/2012','N')
,('XYZ456','ZZZ999','01/30/2012','N')
,('XYZ456','ZZZ123','02/09/2012','N')
,('XYZ456','ZZZ123','04/13/2012','Y')
,('XYZ456','ZZZ123','06/23/2012','N')
,('XYZ456','ZZZ123','010/5/2012','Y')
,('XYZ456','ZZZ123','11/18/2012','N')


CREATE TABLE #Orders (division CHAR(6),    ID CHAR(6),   dat DATETIME, flag CHAR(1),flag_int INTEGER, rn BIGINT, OrderGroup INT)

CREATE CLUSTERED INDEX IDX_C_Temp_Order ON #Orders(division, id,rn)

INSERT INTO #Orders (division, id,dat,flag,flag_int,rn,OrderGroup)
SELECT division
      ,ID
      ,dat
      ,flag
      ,CASE flag WHEN 'y' THEN 1 ELSE 0 END flag_int
      ,ROW_NUMBER() OVER (PARTITION BY division, id ORDER BY dat) rn
      ,0 OrderGroup
  FROM Orders

DECLARE @OrderGroup INT = 0
UPDATE #Orders
   SET @OrderGroup = OrderGroup  = CASE WHEN rn = 1 THEN 1 ELSE @OrderGroup + flag_int END
  FROM #Orders

SELECT * 
  FROM #Orders
 ORDER BY division
         ,ID
         ,rn

DROP TABLE #Orders

這篇關于根據標志對計數遞增的記錄進行分組的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Modify Existing decimal places info(修改現有小數位信息)
The correlation name #39;CONVERT#39; is specified multiple times(多次指定相關名稱“CONVERT)
T-SQL left join not returning null columns(T-SQL 左連接不返回空列)
remove duplicates from comma or pipeline operator string(從逗號或管道運算符字符串中刪除重復項)
Change an iterative query to a relational set-based query(將迭代查詢更改為基于關系集的查詢)
concatenate a zero onto sql server select value shows 4 digits still and not 5(將零連接到 sql server 選擇值仍然顯示 4 位而不是 5)
主站蜘蛛池模板: h片在线免费观看 | 国产精品亚洲一区二区三区在线 | 一区二区免费看 | 国产精品免费一区二区三区 | 成人精品久久日伦片大全免费 | 日韩国产精品一区二区三区 | 日韩视频在线一区 | 精品1区2区3区4区 | 91精品久久久久久久久中文字幕 | 久久午夜视频 | 国产精品久久国产精品 | 精品久久久999 | 久久精品国产一区二区 | 成年人在线观看视频 | 成人一区二区三区在线观看 | 欧美精品一二区 | 久久久久香蕉视频 | 第四色播日韩第一页 | 国产精品视频一区二区三区四蜜臂 | 免费一级做a爰片久久毛片潮喷 | 91久久精品| 午夜影视网 | 黑人巨大精品 | 日韩欧美中文字幕在线观看 | 欧美老少妇一级特黄一片 | 国产麻豆一区二区三区 | 91超碰caoporn97人人 | 天堂一区| 欧美久久久久久 | 99re视频| 亚洲精品久久久久久久久久久 | 91精品久久久久久久久 | 九色av| 黄色在线播放视频 | 亚洲不卡视频 | 天天射网站 | 欧美一区二区三区国产精品 | 久久成人av| 激情伊人网 | 午夜影院操 | 日韩中文字幕第一页 |