簡體   English   中英

SQL Server:根據另一列中第一次出現的值創建一列

[英]SQL Server : create a column based on the first occurrence of a value in another column

考慮 SQL Server 中的下表:

在此處輸入圖片說明

我想編寫一個 SQL 查詢來生成列Indicator 對於每個類別,第一次出現Flag = 1 ,應將此列設置為 1。

例如,對於類別 A,對於日期 1/3/2019、1/4/2019、1/5/2019、1/6/2019,列Flag設置為 1。 由於 1/3/2019 是Flag設置為 1 的最早日期,因此該記錄的Indicator列也應設置為 1。

我應該為此編寫什么 SQL Server 查詢?

PS:圖中已經顯示了Indicator列所需的輸出。

下面是在 SQL Server 中生成表的代碼:

CREATE TABLE myTable
(
    Category CHAR(1),
    Date DATE,
    Flag INT
)

INSERT INTO myTable (Category, Date, Flag) 
VALUES ('A', '2019-01-01', 0), ('A', '2019-02-01', 0),
       ('A', '2019-03-01', 1), ('A', '2019-04-01', 1),
       ('A', '2019-05-01', 1), ('A', '2019-06-01', 1),
       ('B', '2019-01-01', 0), ('B', '2019-02-01', 0),
       ('B', '2019-03-01', 0), ('B', '2019-04-01', 0),
       ('B', '2019-05-01', 1), ('B', '2019-06-01', 1),
       ('C', '2019-01-01', 0), ('C', '2019-02-01', 0),
       ('C', '2019-03-01', 0), ('C', '2019-04-01', 1),
       ('C', '2019-05-01', 1), ('C', '2019-06-01', 1),
       ('C', '2019-07-01', 1)

使用派生表和MIN()確定具有標志的類別的第一個日期的一種方法。 將其連接回原始表。

演示

SELECT 
    yt.*
  , ISNULL(b.Indicator, 0) AS Indicator
FROM YourTable yt
LEFT JOIN 
  (SELECT category, MIN(date) AS date, 1 AS Indicator
  FROM dbo.YourTable
  WHERE Flag = 1
  GROUP BY Category) b ON b.Category = yt.Category AND b.date = yt.date

我正在考慮使用min()函數作為窗口函數:

select t.*, 
       (case then t.flag = 1 and
                  t.date = min(t.date) over (partition by t.category, t.flag)
             then 1 else 0
        end) as indicator
from myTable t
order by t.Category, t.date

其它的辦法

演示

CREATE TABLE myTable
 (
    Category char(1),
    Date date,
    Flag int
 )

        INSERT INTO myTable (Category, Date, Flag) VALUES
        ('A','2019-01-01',0),
        ('A','2019-02-01',0),
        ('A','2019-03-01',1),
        ('A','2019-04-01',1),
        ('A','2019-05-01',1),
        ('A','2019-06-01',1),
        ('B','2019-01-01',0),
        ('B','2019-02-01',0),
        ('B','2019-03-01',0),
        ('B','2019-04-01',0),
        ('B','2019-05-01',1),
        ('B','2019-06-01',1),
        ('C','2019-01-01',0),
        ('C','2019-02-01',0),
        ('C','2019-03-01',0),
        ('C','2019-04-01',1),
        ('C','2019-05-01',1),
        ('C','2019-06-01',1),
        ('C','2019-07-01',1);

    select t.* , 
    CASE WHEN T.FLAG=1 AND FIRST_VALUE(T.DATE) OVER (PARTITION BY T.Category ORDER BY t.FLAG desc, t.Date asc)=T.DATE THEN 1 
   ELSE 0 END Indicator
    from myTable t
    order by t.Category, t.date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM