Увеличить столбец на основе другого столбца

В электронной таблице Excel, которая охватывает несколько лет, но содержит строку для каждой даты, у нас есть два столбца: номер недели и общий номер недели. Очевидно, что первый столбец сбрасывается на 1 в начале каждого года, но второй столбец продолжает показывать 53, 54, 55 и так далее.

Формула в Excel проста:

=IF(I727=I726,J726,J726+1)  

Столбец I = номер недели, Столбец J = общий номер недели.

К сожалению, я не могу понять, как сгенерировать те же данные с помощью оператора SQL!

Кто-нибудь может посоветовать?

Спасибо

Базы данных — это не электронные таблицы. Кажется, вы спрашиваете о Календарной таблице, которую можно легко создать на 10 или 20 лет вперед, с заранее заполненными полями для лет, месяцев, дней, дней недели, номеров недель, кварталов, семестров или любого другого отчетного периода или этикетка, которая вам нужна. Нет смысла вручную увеличивать что-либо после создания таблицы календаря.

Panagiotis Kanavos 05.06.2024 16:55

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

Wheels496 05.06.2024 17:04

Затем экспортируйте данные в электронную таблицу и обрабатывайте их как электронную таблицу. SQL Server — это не электронная таблица; ваш менеджер просит вас относиться к этому так, как будто он демонстрирует свое непонимание.

Thom A 05.06.2024 17:05

@ Wheels496 Wheels496 стоимость репликации листа Excel не просто в несколько раз превышает стоимость запуска сценария Аарона Бертрана (в последнее время — администратора базы данных StackOverflow). Производительность запросов, вычисляющих даты вместо использования индексированных таблиц календаря, будет намного ниже.

Panagiotis Kanavos 05.06.2024 17:16

@ Wheels496, если вы действительно хотите генерировать даты на лету, вы найдете множество ответов SO, которые показывают, как использовать, например, GENERATE_SERIES или sys.objects SQL Server для генерации числовых последовательностей, а затем генерировать даты и метки с помощью DATEADD(d,generated_num,some-base_address). Никто не пытается использовать выражения, подобные тому, которое вы опубликовали. Сам номер недели можно сгенерировать с помощью DATEPART(wk,date). День года с DATEPART(dy,date)

Panagiotis Kanavos 05.06.2024 17:21

Нитпик, их не называют "полями". В таблицах есть строки и столбцы, но нет «полей».

Thom A 05.06.2024 17:46

Вы также можете использовать функцию DENSE_RANK(), как в DENSE_RANK() OVER(ORDER BY Year, Week) AS OverallWeek. См. эту db<>скрипту для демонстрации использования двух вариантов недель: календарных недель, которые могут иметь короткие недели в начале или конце года, и недель ISO, которые всегда состоят из 7 дней и иногда могут охватывать границы года. . Как предлагалось ранее, лучше всего загрузить это в таблицу календаря, которую можно присоединить к вашей таблице данных. Скажите своему руководителю, что все эксперты говорят: «Базы данных — это не электронные таблицы, и к ним не следует относиться как к таковым».

T N 05.06.2024 19:23

Еще одна альтернатива — использовать идентификаторы в стиле ISO-8601 «yyyyWww» вместо целого числа. Преимущество состоит в том, что это не зависит от даты начала ваших данных. Вам все равно нужно подумать, использовать ли календарные недели, которые могут состоять из коротких недель в начале или в конце года, или недели ISO, которые всегда длятся 7 дней, но иногда могут охватывать границы года. Также следует просмотреть начало/конец недели (обычно воскресенье-суббота в США, часто понедельник-воскресенье в других странах, а иногда суббота-пятница для отслеживания родов).

T N 06.06.2024 02:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
8
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

пытаться:

WITH DateWithRowNumber AS (
    SELECT 
        DateColumn,
        DATEPART(WEEK, DateColumn) AS WeekNumber,
        DENSE_RANK() OVER (ORDER BY YEAR(DateColumn), DATEPART(WEEK, DateColumn)) AS ContinuousWeekNumber
    FROM 
        YourTable
)
SELECT
    DateColumn,
    WeekNumber,
    ContinuousWeekNumber
FROM 
    DateWithRowNumber
ORDER BY 
    DateColumn;

результат:

См. подход player0 в примере

ValNik 05.06.2024 22:52
Ответ принят как подходящий

Возможно рядом с recreate what was in the spreadsheet

select DateColumn,WeekNumber 
  ,1+sum(case when WeekNumber<>PrevWeekNumber then 1 else 0 end)
       over(order by DateColumn) ContinuousWeekNumber
from (
  select DateColumn
     ,DATEPART(WEEK, DateColumn) AS WeekNumber
     ,DATEPART(WEEK, lag(DateColumn,1,DateColumn)over(order by DateColumn)) AS PrevWeekNumber
  from YourTable
)t

Это работает, когда (пробелы в DataColumn) <(1 неделя)

Демо

Другие вопросы по теме