SQL Server: выбор даты и времени и группировка по дате - PullRequest
1 голос
/ 21 марта 2012

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

Что я пытаюсь сделать: у меня есть таблица с несколькими столбцами, и мне нужны только два из них: дата и время создания записи и идентификатор записи. Обратите внимание, что часть часов / минут / секунд важна здесь .

Однако я хочу сгруппировать свой выбор только по части ДАТА. В противном случае все группы, скорее всего, будут иметь 1 элемент.

Вот мой запрос:

SELECT MyDate as DateCr, COUNT(Id) as Occur
FROM MyTable tb WITH(NOLOCK)
GROUP BY CAST(tb.MyDate as Date)
ORDER BY DateCr ASC

Однако я получаю следующую ошибку:

Столбец "MyTable.MyDate" недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Если я не выполняю приведение в GROUP BY, все в порядке. Если я приведу MyDate к DATE в SELECT и сохраню CAST из GROUP BY, все снова будет хорошо. Очевидно, он хочет сохранить тот же формат DATE или DATETIME в GROUP BY, что и в SELECT.

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

LE: Я получаю вышеуказанную ошибку в строке 1.

LE2: С другой стороны, мой вопрос действительно не очень ясен. Вы можете игнорировать вышеуказанный подход, если он полностью неверен. Ниже приведен пример сценария

Позвольте мне сказать вам, что мне нужно: я хочу получить (1) DateTime при создании каждой записи. Так что, если у меня есть 20 записей, я хочу получить 20 DateTimes. Затем, если у меня есть несколько записей, созданных в один и тот же день, я хочу количество этих записей. Например, допустим, я создал 3 записи в понедельник, 1 во вторник и 2 сегодня. Затем из моей таблицы мне нужны даты и время этих 6 записей + количество записей, которые были созданы в каждый день (3 на 19.03.2012, 1 на 20.03.2012 и 2 на 21.03.2012).

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Я не уверен, почему вы возражаете против выполнения CONVERT в SELECT и GROUP BY. Это выглядит как вполне логичный способ сделать это:

SELECT 
  DateCr = CONVERT(DATE, MyDate), 
  Occur = COUNT(Id)
FROM dbo.MyTable
GROUP BY CONVERT(DATE, MyDate)
ORDER BY DateCr;

Если вы хотите сохранить временную часть MyDate в списке SELECT, зачем вам группировка? Или как вы ожидаете, что результаты будут выглядеть? У вас будет строка для каждого отдельного значения даты / времени, где группировка указывает на то, что вы хотите строку для каждого дня. Может быть, вы могли бы уточнить, что вы хотите, с некоторыми образцами данных и примером желаемых результатов.

Кроме того, почему вы используете NOLOCK? Готовы ли вы обменять точность на случайную турбо-кнопку?

РЕДАКТИРОВАТЬ добавление версии для смешанных требований:

;WITH d(DateCr,d,Id) AS 
(
  SELECT MyDate, d = CONVERT(DATE, MyDate), Id
  FROM dbo.MyTable)
SELECT DateCr, Occur = (SELECT COUNT(Id) FROM d AS d2 WHERE d2.d = d.d)
FROM d
ORDER BY DateCr;
0 голосов
/ 02 мая 2014

Несмотря на то, что это старый пост, я решил ответить на него.Решение ниже будет работать с SQL Server 2008 и выше.В нем используется предложение over, так что будут возвращены отдельные строки, но также будут учитываться строки, сгруппированные по дате (без времени).

SELECT MyDate as DateCr, 
      COUNT(Id) OVER(PARTITION BY CAST(tb.MyDate as Date)) as Occur
FROM MyTable tb WITH(NOLOCK)
ORDER BY DateCr ASC

Даррен Уайт

...