Использование ORDER BY для SELECT DISTINCT в TSQL - PullRequest
6 голосов
/ 21 января 2009

Я пытаюсь получить список строк с датой, упорядоченных по дате, как это ...

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate
FROM dbo.ProviderProcessGeneratedDate
ORDER BY GeneratedDate

Это заказы от varchar, в который я конвертировал даты.

пример ...
02/01/2008
02/15/2008
02/21/2007
02/23/2007
02/29/2008

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

SELECT CONVERT(Varchar(10), a.GeneratedDate, 101) AS GeneratedDate
FROM (SELECT DISTINCT Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) AS GeneratedDate
      FROM dbo.ProviderProcessGeneratedDate) a
ORDER BY a.GeneratedDate DESC

Чтобы получить то, что я действительно хочу ...
01/11/2008
01/04/2008
12/28/2007
12/21/2007

Есть ли более простой способ? Похоже, много работы, чтобы сделать что-то так просто.

Ответы [ 8 ]

2 голосов
/ 21 января 2009

Причиной, по которой ваш первый запрос дал заказ, отличный от того, что вы хотели, является ...
- Вы используете поле «GeneratedDate» для создания вашей строки
- Затем вы создаете псевдоним этого результирующего поля для «GeneratedDate»
- Затем вы заказываете по «GeneratedDate» без указания таблицы
- Таким образом, поле результата используется для заказа

Простое исправление упоминается в других ответах ...

ORDER BY ProviderProcessGeneratedDate.GenerateDate

При указании таблицы нет путаницы, и вы получите желаемый результат.


[В сторону]

Как правило, я всегда добавляю свои поля к [table]. чтобы избежать любой двусмысленности. Тем более, что я часто возвращаюсь позже и добавляю в объединение, заставляя нед для имени таблицы.

Кроме того, я называю имена таблиц. Не для таких вещей, как [а], а для чего-то значимого, например, [Даты]. Это сокращает запрос, но также позволяет мне изменять используемую таблицу без необходимости изменения других ссылок на нее в других частях запроса.

[конец в сторону]

EDIT:

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

Как говорится в комментарии, вы не можете указывать что-либо в ORDER BY, если это не указано в SELECT DISTINCT.

Поэтому я бы вместо этого попробовал GROUP BY ...

SELECT
    Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101))
FROM
    ProviderProcessGeneratedDate
GROUP BY
    GeneratedDate
ORDER BY
    GeneratedDate

Предполагается, что значение GeneratedDate равно 1: 1 с вашей формулой CONVERT. Если, например, у вас есть TIME в ваших полях GeneratedDate, а ваш формат даты в CONVERT - нет; вам нужно вырезать время из поля GeneratedDate ...

SELECT
    Convert(DATETIME,CONVERT(Varchar(10), DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0), 101))
FROM
    ProviderProcessGeneratedDate
GROUP BY
    DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0)
ORDER BY
    DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0)
1 голос
/ 21 января 2009

Вы также можете использовать CTE, если используете SQL 2005 или 2008.

ваш код будет выглядеть так:

WITH Dates(GeneratedDate) AS
(
SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate
FROM dbo.ProviderProcessGeneratedDate
)

SELECT GeneratedDate FROM Dates ORDER BY GeneratedDate
1 голос
/ 21 января 2009

Просто чтобы добавить к ответам выше ...

Вы можете конвертировать обратно в строку вне tsql. Просто верните тип даты и времени и преобразуйте его в нужный формат даты в коде (слой отображения).

1 голос
/ 21 января 2009
  SELECT DISTINCT Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) 
                     AS GeneratedDate,
        A.GeneratedDate OrderByDate       
  FROM dbo.ProviderProcessGeneratedDate A
  Order By A.GeneratedDate Desc
0 голосов
/ 21 января 2009

Используйте GROUP BY вместо DISTINCT:

SELECT 
    CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate
FROM 
    dbo.ProviderProcessGeneratedDate AS BaseDates
GROUP BY 
    BaseDates.GeneratedDate, 
    CONVERT(Varchar(10), GeneratedDate, 101)
ORDER BY 
    BaseDates.GeneratedDate
0 голосов
/ 21 января 2009

Измените ORDER BY вашего исходного оператора, чтобы использовать сортируемую строку даты:

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate
FROM dbo.ProviderProcessGeneratedDate
ORDER BY CONVERT(Varchar(10), GeneratedDate, 112) 
0 голосов
/ 21 января 2009

Возможно, вам просто нужно использовать псевдоним другого поля, чтобы он использовал дату для упорядочения, а не форматированную строку? * 1001 Т.е. *

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDateString
FROM dbo.ProviderProcessGeneratedDate
ORDER BY GeneratedDate

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

0 голосов
/ 21 января 2009

Я думаю, вы можете использовать:

ORDER BY dbo.ProviderProcessGeneratedDate.GeneratedDate

заставить его использовать значение из исходной таблицы вместо вашего нового измененного значения? Вы даже можете добавить псевдоним к предложению FROM:

FROM dbo.ProviderProcessGeneratedDate ppgd

Чтобы вы могли использовать псевдоним "ppgd" вместо полного имени таблицы в моем первом утверждении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...