MS SQL:需要从单元格中获取类似行的行值,代码无法正常工作
我有100个excel sheetsCSV文件需要用于历史加载。我将使用ETL将所有CSV加载到一个stage表中 我试图从类似行的单元格中获取行值。请查看中的快照 这里的输出快照:黑勾是正确的,红十字是错误的 前三部分我答对了,但其他部分我答错了。红色的横截面是错误的,因为我需要在行截面中获取日期MS SQL:需要从单元格中获取类似行的行值,代码无法正常工作,sql,sql-server,Sql,Sql Server,我有100个excel sheetsCSV文件需要用于历史加载。我将使用ETL将所有CSV加载到一个stage表中 我试图从类似行的单元格中获取行值。请查看中的快照 这里的输出快照:黑勾是正确的,红十字是错误的 前三部分我答对了,但其他部分我答错了。红色的横截面是错误的,因为我需要在行截面中获取日期 ALTER TABLE dbo.[sql GET VALUES] ADD rowId INT IDENTITY(1, 1) ALTER TABLE dbo.[sql GET VALUES] ADD
ALTER TABLE dbo.[sql GET VALUES] ADD rowId INT IDENTITY(1, 1)
ALTER TABLE dbo.[sql GET VALUES] ADD RequiredColumn VARCHAR(255) NULL
UPDATE a
SET requiredColumn = column1
FROM dbo.[sql GET VALUES] a
WHERE column1 LIKE '%Sunday%'
OR column1 LIKE '%Monday%'
OR column1 LIKE '%tuesday%'
OR column1 LIKE '%wednesday%'
OR column1 LIKE '%thursday%'
OR column1 LIKE '%friday%'
OR column1 LIKE '%saturday%'
IF OBJECT_ID('Tempdb.dbo.#temptable') IS NOT NULL
BEGIN
DROP TABLE tempdb.dbo.#temptable
END
SELECT rowID,
CASE
WHEN CONVERT(VARCHAR(255), requiredcolumn) IS NOT NULL THEN
CONVERT(VARCHAR(255), requiredcolumn)
ELSE
(
SELECT MAX(requiredcolumn)
FROM dbo.[sql GET VALUES]
WHERE rowID <= t.rowID - 1
)
END AS requiredcolumn
INTO #temptable
FROM dbo.[sql GET VALUES] t
UPDATE a
SET a.requiredcolumn = i.requiredcolumn
-- select a.requiredcolumn, i.requiredcolumn,*
FROM #temptable i
INNER JOIN dbo.[sql GET VALUES] a
ON i.rowID = a.rowID
SELECT *
FROM [sql GET VALUES]
我需要为每一行获取日期信息,每一行的列上都有日期值。在这里尝试一下,注意下面代码中的一些假设 rowid从第一节第一行的1开始。 每个部分都有相同数量的行,并且是完整的。 每个部分都有顺序相同的行 如果不是上述情况,则需要更多列来标识每个节并区分其中的行。确定节中哪些行有日期或类似的日期
--DROP TABLE #c
CREATE TABLE #C (col varchar(255) ,rowid int,col1 varchar(255))
INSERT INTO #C values('Wednesday, March 06, 2019 - Weather: TY: 15‹C', 1,NULL)
INSERT INTO #C values('a', 2,NULL)
INSERT INTO #C values('b', 3,NULL)
INSERT INTO #C values('c', 4,NULL)
INSERT INTO #C values('Thursday, March 07, 2019 - Weather: TY: 12‹C', 5,NULL)
INSERT INTO #C values('a', 6,NULL)
INSERT INTO #C values('b', 7,NULL)
INSERT INTO #C values('c', 8,NULL)
INSERT INTO #C values('Friday, March 08, 2019 - Weather: TY: 12‹C', 9,NULL)
INSERT INTO #C values('a', 10,NULL)
INSERT INTO #C values('b', 11,NULL)
INSERT INTO #C values('c', 12,NULL)
WITH InterSection AS
(
SELECT *,
(rowid - 1) % 4 AS SectionRowId,
((rowid - 1) % 4) - ROW_NUMBER() OVER (ORDER BY rowid) AS SectionId
FROM #C
)
SELECT c.*, ii.col AS NewCol1 FROM #C c
LEFT JOIN InterSection i ON c.rowid = i.rowid
LEFT JOIN InterSection ii ON ii.SectionRowId = 0 AND ii.SectionId = i.SectionId
使用CTE和双重使用MAX的窗口功能可以实现这一点 然后它可以在1个update语句中完成 在SQL中,第一个最大值使用有效的column1值计算上一个/当前的最高Id。 第二个MAX使用该计算出的id来获取有效的column1值 样本数据: 更新和选择 返回:
不要链接到dropbox。你的链接不起作用。提供示例数据和最少的运行示例。你的问题一点也不清楚。你还会发现,人们不会信任从陌生人那里下载资源的链接。将DDL和DML放在您的帖子中。@CodeMonkey我不太确定如何解释我的要求,如果我的帖子不清楚,很抱歉,请参阅附件中的屏幕截图和示例表创建脚本。@Larnu我已使用快照和示例表创建进行了编辑。该链接在匿名模式下对我有效,非常确定它应该对其他人有效。@SuccessMaharjan谢谢更新,我现在理解了。今天晚些时候我会发布一个答案。嘿@codemonkey,在不同的日期,节中的行是不同的。@SuccessMaharjan这很公平,然后我会使用LukStorms解决方案。或者你可以扩展我的,并映射每一行,就像他在他的CASE-WHEN-like模式中所做的那样。非常感谢你
--DROP TABLE #c
CREATE TABLE #C (col varchar(255) ,rowid int,col1 varchar(255))
INSERT INTO #C values('Wednesday, March 06, 2019 - Weather: TY: 15‹C', 1,NULL)
INSERT INTO #C values('a', 2,NULL)
INSERT INTO #C values('b', 3,NULL)
INSERT INTO #C values('c', 4,NULL)
INSERT INTO #C values('Thursday, March 07, 2019 - Weather: TY: 12‹C', 5,NULL)
INSERT INTO #C values('a', 6,NULL)
INSERT INTO #C values('b', 7,NULL)
INSERT INTO #C values('c', 8,NULL)
INSERT INTO #C values('Friday, March 08, 2019 - Weather: TY: 12‹C', 9,NULL)
INSERT INTO #C values('a', 10,NULL)
INSERT INTO #C values('b', 11,NULL)
INSERT INTO #C values('c', 12,NULL)
WITH InterSection AS
(
SELECT *,
(rowid - 1) % 4 AS SectionRowId,
((rowid - 1) % 4) - ROW_NUMBER() OVER (ORDER BY rowid) AS SectionId
FROM #C
)
SELECT c.*, ii.col AS NewCol1 FROM #C c
LEFT JOIN InterSection i ON c.rowid = i.rowid
LEFT JOIN InterSection ii ON ii.SectionRowId = 0 AND ii.SectionId = i.SectionId
IF OBJECT_ID('tempdb..#C', 'U') IS NOT NULL DROP TABLE #C;
CREATE TABLE #C (rowid int primary key identity(1,1), column1 VARCHAR(255), RequiredColumn VARCHAR(255));
insert into #C (column1) values
('Wednesday, March 06, 2019 - Weather: TY: 15‹C'),
('a'),
('b'),
('c'),
('Thursday, March 07, 2019 - Weather: TY: 12‹C'),
('d'),
('e'),
('f'),
('Friday, March 08, 2019 - Weather: TY: 12‹C'),
('g'),
('h'),
('i');
;WITH CTE AS
(
select *,
max(case when rowid = MaxPrevId then column1 end) over (partition by MaxPrevId) as column1calc
from
(
select rowid, column1, RequiredColumn,
max(case
when column1 LIKE '%sunday%'
OR column1 LIKE '%monday%'
OR column1 LIKE '%tuesday%'
OR column1 LIKE '%wednesday%'
OR column1 LIKE '%thursday%'
OR column1 LIKE '%friday%'
OR column1 LIKE '%saturday%'
then rowid
end) over (order by rowid ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as MaxPrevId
from #C
) q
)
UPDATE CTE
SET RequiredColumn = column1calc;
select rowid, RequiredColumn
from #C
order by rowid;
rowid RequiredColumn
1 Wednesday, March 06, 2019 - Weather: TY: 15‹C
2 Wednesday, March 06, 2019 - Weather: TY: 15‹C
3 Wednesday, March 06, 2019 - Weather: TY: 15‹C
4 Wednesday, March 06, 2019 - Weather: TY: 15‹C
5 Thursday, March 07, 2019 - Weather: TY: 12‹C
6 Thursday, March 07, 2019 - Weather: TY: 12‹C
7 Thursday, March 07, 2019 - Weather: TY: 12‹C
8 Thursday, March 07, 2019 - Weather: TY: 12‹C
9 Friday, March 08, 2019 - Weather: TY: 12‹C
10 Friday, March 08, 2019 - Weather: TY: 12‹C
11 Friday, March 08, 2019 - Weather: TY: 12‹C
12 Friday, March 08, 2019 - Weather: TY: 12‹C