Получить отличную максимальную дату, используя SQL - PullRequest
1 голос
/ 14 апреля 2011

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

Учитывая pc_tmppl_tbl

pc_tmppl_attach pc_tmppl_val1    pc_tmppl_crtdt

AJC05-06    AJCINT       2005-08-15 10:32:03.790
AJC06-07    AJCINT       2006-10-17 10:02:06.570
AJC07-08    AJCINT       2007-06-13 10:44:53.573
AJC08-09    AJCINT       2008-06-27 09:51:17.290
AJC09-10    AJCINT       2009-07-20 14:26:06.270
AJC10-11    AJCINT       2010-08-26 11:54:32.777
AJC99-001   AJCINT       2005-05-30 19:30:51.623
ALPI05-06   ALPINE       2005-05-30 19:30:51.623
ALPI07-08   ALPINE       2006-12-11 13:57:09.923
ALPI07-08   ALPINE       2007-05-24 14:04:07.867
ALPI08-09   ALPINE       2008-04-30 09:49:24.140

Я хочу, чтобы он возвратил максимальную датудля pc_tmppl_crtdt и соответствующего ему pc_tmppl_attach, так что

ALPI08-09   ALPINE       2008-04-30 09:49:24.140
AJC10-11    AJCINT       2010-08-26 11:54:32.777

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

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011
Select T.pc_tmppl_attach, T.pc_tmppl_val1, T.pc_tmppl_crtdt
From pc_temppl_tbl As T
    Join    (
            Select pc_tmppl_val1, Max( T1.pc_tmppl_crtdt ) As MaxDateTime
            From pc_temppl_tbl As T1
            Group By T1.pc_tmppl_val1
            ) As Z
        On Z.pc_tmppl_val1 = T.pc_tmppl_val1
            And Z.MaxDateTime = T.pc_tmppl_crtdt
2 голосов
/ 14 апреля 2011

Вы не определили, какой сервер и версию вы используете - если вы используете SQL Server 2005 или новее, вы можете использовать CTE (Common Table Expression) и функцию ранжирования - что-то вроде этого:

;WITH PartitionedData AS
(
   SELECT 
       pc_tmppl_attach, pc_tmppl_val1, pc_tmppl_crtdt,
       ROW_NUMBER() OVER(PARTITION BY pc_tmppl_val1 
                         ORDER BY pc_tmppl_crtdt DESC) AS 'RowNumber'
  FROM dbo.pc_tmppl_tbl
)
SELECT
   pc_tmppl_attach, pc_tmppl_val1, pc_tmppl_crtdt
FROM
   PartitionedData
WHERE
   RowNumber = 1

По сути, CTE (внутренний выбор) собирает все данные из вашей таблицы, разбивает их по столбцу pc_tmppl_val1, поэтому каждая группа значений для pc_tmppl_val1 начинает обратный отсчет с 1 - и упорядочивает эти записи по pc_tmppl_crtdt по убыванию - самая новая запись - первая.

Таким образом, для каждого значения pc_tmppl_val1 самая новая запись - это запись с RowNumber = 1, и это то, что дает внешний SELECT (основанный на CTE).

CTE и функция ранжирования также очень гибкие - если вам нужно добавить 3 верхние записи для каждого значения pc_tmppl_val1, просто измените внешнее условие WHERE на

WHERE RowNumber <= 3

и все готово!

Функции CTE (Common Table Expression) и ранжирования соответствуют стандарту ANSI SQL - поэтому его поддерживают и другие базы данных, кроме Microsoft SQL Server (я просто знаю SQL Server лучше всего - поэтому я использую его в качестве образца).

1 голос
/ 14 апреля 2011

Использование коррелированного запроса (который должен работать с большинством баз данных sql):

SELECT pc_tmppl_attach,pc_tmppl_val1, pc_tmppl_crtdt
FROM pc_tmppl_tbl AS tbl_ext
WHERE pc_tmppl_crtdt = (
                        SELECT MAX(tbl_int.pc_tmppl_crtdt)
                        FROM pc_tmppl_tbl AS tbl_int
                        WHERE tbl_int.pc_tmppl_val1 = tbl_ext.pc_tmppl_val1
                       )
0 голосов
/ 14 апреля 2011
SELECT TOP 1 [pc_tmppl_attach], [pc_tmppl_crtdt]
FROM [Given pc_tmppl_tbl]
order by pc_tmppl_crtdt desc
...