Попробуйте:
SELECT e.*
FROM [PDP].[dbo].[Existencia_WH_PRISM_BACKUP] e
INNER JOIN (
SELECT MAX(dExd_Fecha) AS dExd_Fecha_Max
FROM [PDP].[dbo].[Existencia_WH_PRISM_BACKUP]
GROUP BY DATEADD(DD, DATEDIFF(DD, 0, dExd_Fecha), 0)
) m
ON e.dExD_Fecha = m.dExd_Fecha_Max
ORDER BY e.dEXd_Fecha
Идея состоит в том, чтобы создать подзапрос максимальных дат, сгруппированных по дням, а затем объединиться с основной таблицей.
Если вы хотите определитьзначения, которые выходят за пределы этого диапазона, чтобы удалить их, вы можете выполнить левое внешнее объединение с набором:
/** DELETE FROM x **/
SELECT *
FROM (
SELECT
dExd_Fecha,
YEAR(dExd_Fecha) AS dExd_Ano,
MONTH(dExd_Fecha) AS dExd_Semana,
NTILE(10) OVER (ORDER BY dExd_Fecha) AS dExd_Groupo
FROM [Existencia_WH_PRISM_BACKUP]
) x
LEFT OUTER JOIN (
SELECT MAX(dExd_Fecha) AS dExd_Fecha_Max
FROM [PDP].[dbo].[Existencia_WH_PRISM_BACKUP]
GROUP BY DATEADD(DD, DATEDIFF(DD, 0, dExd_Fecha), 0)
) y
ON x.dExd_Fecha = y.dExd_Fecha_Max
WHERE
x.dExd_Ano = 2010
AND x.dExd_Semana = 1
AND y.dExd_Fecha_Max IS NULL
ORDER BY x.dExd_Fecha
Этот оператор SELECT использует значения YEAR и MONTH в подзапросе для выполнения пакетногоподход к обработке и выбор / удаление записей в меньших количествах.
Оригинальный ответ ниже:
SELECT e.*
FROM [PDP].[dbo].[Existencia_WH_PRISM_BACKUP] e
INNER JOIN (
SELECT
MAX(dExd_Fecha) AS dExd_Fecha_Max,
/** get the year of the last date **/
YEAR(MAX(DATEADD(YY, DATEDIFF(YY, 0, dExd_Fecha), 0))) AS dExd_Ano_Max,
/** get the month of the last date **/
MONTH(MAX(DATEADD(MM, DATEDIFF(MM, 0, dExd_Fecha), 0))) AS dExd_Mes_Max,
/** get the week of the last date **/
DATEPART(WEEK, MAX(dExd_Fecha)) AS dExd_Semana_Max,
/** set a number to divide the total rows into ten groups **/
NTILE(10) OVER (ORDER BY MAX(dExd_Fecha)) AS dExd_Groupo
FROM [PDP].[dbo].[Existencia_WH_PRISM_BACKUP]
GROUP BY DATEADD(DD, DATEDIFF(DD, 0, dExd_Fecha), 0)
) m
ON e.dExD_Fecha = m.dExd_Fecha_Max
WHERE
m.dExd_Ano_Max = 2010
AND m.dExd_Mes_Max = 1