SQL Server:根据另一列中第一次出现的值创建列
请考虑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),
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语句的输出不满足要求。为什么?结果与图像相同对不起,您是对的。我的解释错了,所以我的答案也错了。我将删除我的答案。