Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:根据另一列中第一次出现的值创建列_Sql_Sql Server - Fatal编程技术网

SQL Server:根据另一列中第一次出现的值创建列

SQL Server:根据另一列中第一次出现的值创建列,sql,sql-server,Sql,Sql Server,请考虑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),

请考虑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)

我想编写一个SQL查询来生成列
指示符
。对于每个类别,在第一次出现
Flag=1
时,此列应设置为1

例如,对于A类,日期为2019年1月3日、2019年1月4日、2019年1月5日、2019年1月6日的列
Flag
设置为1。由于2019年1月3日是
标志
设置为1的最早日期,因此该记录的
指标
列也应设置为1

我应该为此编写什么SQL Server查询

PS:图中已经显示了
指示器
列的所需输出

以下是在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

请参阅MySQL SQL Server。请仅标记您真正使用的RDBMS。此外,图像对你寻求帮助的人也没有帮助。按原样发布数据,
文本
,并显示您追求的结果和您在问题中的尝试;解释它们为什么不起作用。这能回答你的问题吗?此sql语句的输出不满足要求。为什么?结果与图像相同对不起,您是对的。我的解释错了,所以我的答案也错了。我将删除我的答案。