MS SQL: необходимо получить мудрое значение строки из ячейки для похожих строк, код работает неправильно - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть 100 листов Excel (CSV-файлы), которые мне нужно использовать для исторической нагрузки.Я собираюсь загрузить все CSV в таблицу этапов, используя ETL.

Я пытаюсь получить построчное значение из ячейки для похожих строк.Пожалуйста, посмотрите снимок в ссылке .

Here is a sample creation of table script, else please refer to above link for full sample data

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)

снимок вывода здесь: черная галочка правильная, красные крестики неправильные enter image description here

Я правильно понял первые три раздела, а в других я ошибся.красные сечения неверны, так как мне нужно получить дату в строке строки.

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]

Мне нужно получить информацию о дате в строке для каждой строки со значением даты вдоль столбца.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Здесь попробуйте это, обратите внимание на некоторые предположения о приведенном ниже коде.

  1. rowid начинается с 1 в первой строке первого раздела.
  2. Каждый раздел имеет одинаковое количество строк и завершен.
  3. В каждом разделе есть строки в одном и том же порядке.

Если это не так, вам нужно больше столбцов, чтобы идентифицировать каждый раздел и различать строки в них.Ex.определить, какие строки в разделе имеют дату или что-то подобное.

--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
0 голосов
/ 24 апреля 2019

Использование CTE и двойное использование оконной функции для MAX работает для этого.

И тогда это можно сделать в 1 операторе обновления.

В SQL первый MAX вычисляет самый высокий предыдущий / текущий Id с допустимым значением column1.
Второй MAX использует этот вычисленный идентификатор для получения действительного значения column1.

Пример данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...