В электронной таблице Excel, которая охватывает несколько лет, но содержит строку для каждой даты, у нас есть два столбца: номер недели и общий номер недели. Очевидно, что первый столбец сбрасывается на 1 в начале каждого года, но второй столбец продолжает показывать 53, 54, 55 и так далее.
Формула в Excel проста:
=IF(I727=I726,J726,J726+1)
Столбец I = номер недели, Столбец J = общий номер недели.
К сожалению, я не могу понять, как сгенерировать те же данные с помощью оператора SQL!
Кто-нибудь может посоветовать?
Спасибо
Мой менеджер попросил меня воссоздать то, что было в электронной таблице.
Затем экспортируйте данные в электронную таблицу и обрабатывайте их как электронную таблицу. SQL Server — это не электронная таблица; ваш менеджер просит вас относиться к этому так, как будто он демонстрирует свое непонимание.
@ Wheels496 Wheels496 стоимость репликации листа Excel не просто в несколько раз превышает стоимость запуска сценария Аарона Бертрана (в последнее время — администратора базы данных StackOverflow). Производительность запросов, вычисляющих даты вместо использования индексированных таблиц календаря, будет намного ниже.
@ Wheels496, если вы действительно хотите генерировать даты на лету, вы найдете множество ответов SO, которые показывают, как использовать, например, GENERATE_SERIES или sys.objects SQL Server для генерации числовых последовательностей, а затем генерировать даты и метки с помощью DATEADD(d,generated_num,some-base_address). Никто не пытается использовать выражения, подобные тому, которое вы опубликовали. Сам номер недели можно сгенерировать с помощью DATEPART(wk,date). День года с DATEPART(dy,date)
Нитпик, их не называют "полями". В таблицах есть строки и столбцы, но нет «полей».
Вы также можете использовать функцию DENSE_RANK(), как в DENSE_RANK() OVER(ORDER BY Year, Week) AS OverallWeek. См. эту db<>скрипту для демонстрации использования двух вариантов недель: календарных недель, которые могут иметь короткие недели в начале или конце года, и недель ISO, которые всегда состоят из 7 дней и иногда могут охватывать границы года. . Как предлагалось ранее, лучше всего загрузить это в таблицу календаря, которую можно присоединить к вашей таблице данных. Скажите своему руководителю, что все эксперты говорят: «Базы данных — это не электронные таблицы, и к ним не следует относиться как к таковым».
Еще одна альтернатива — использовать идентификаторы в стиле ISO-8601 «yyyyWww» вместо целого числа. Преимущество состоит в том, что это не зависит от даты начала ваших данных. Вам все равно нужно подумать, использовать ли календарные недели, которые могут состоять из коротких недель в начале или в конце года, или недели ISO, которые всегда длятся 7 дней, но иногда могут охватывать границы года. Также следует просмотреть начало/конец недели (обычно воскресенье-суббота в США, часто понедельник-воскресенье в других странах, а иногда суббота-пятница для отслеживания родов).


пытаться:
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 в примере
Возможно рядом с 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 неделя)
Базы данных — это не электронные таблицы. Кажется, вы спрашиваете о Календарной таблице, которую можно легко создать на 10 или 20 лет вперед, с заранее заполненными полями для лет, месяцев, дней, дней недели, номеров недель, кварталов, семестров или любого другого отчетного периода или этикетка, которая вам нужна. Нет смысла вручную увеличивать что-либо после создания таблицы календаря.