Привет!
Интересует вопрос, как организовать срез последних?
Т.е. есть таблица: id | id_chel (ид человека) | mesto_raboty (место работы) | data (дата). В таблице хранятся люди, место работы и дата. Меняя место работы - мы просто добавляем новую запись, например
1 | Петров | ЧП "У Васи" | 1.10.2010
2 | Иванов | ЧП "У Пети" | 1.10.2010
3 | Петров | ЧП "У Коли" | 5.10.2010
...
Это не связано с 1С. Это просто таблица в какой-нибудь СУБД (MSSQL, MySQL...). Интересует как из такой таблицы получить то, что в 1С называется срезом первых/последних. Интересна сама логика, т.е. указать какое-то условие в запросе или использовать какую-то специальную функцию.
SELECT Max(data), id, id_chel, mesto_raboty
from Ваша База
WHERE id='код'
group by id()
Select *
from base as b1
where Date in (Select MAX(Date) from base as b2 where b1.id=b2.id)
Select Max(Date), id
from base
group by id (ну и все остальные поля которые будут в селекте после id)
Примерно так:
// Входные параметры:
// @someDate: DATETIME
SELECT
srcTable.id
,srcTable.Name
,srcTable.someOtherProperty
,srcTable.Date AS [Дата последнего изменения]
,@someDate AS [Дата среза]
FROM
dbTable AS srcTable // отсюда получаем информацию по id-ам из constraintaTable
INNER JOIN
( // Получение последних идентификаторов на дату с дополнительными условиями
SELECT
dbTable.id,
max(dbTable.data)
FROM dbTable
WHERE dbTable.data < @someDate
AND дополнительные условия на отбор по данным таблицы
) AS constraintTable
ON srcTable.id = constraintTable.id
AND srcTable.data = constraintTable.data
// Входные параметры:
// @someDate: DATETIME
SELECT
srcTable.id
,srcTable.Name
,srcTable.someOtherProperty
,srcTable.Date AS [Дата последнего изменения]
,@someDate AS [Дата среза]
FROM
dbTable AS srcTable // отсюда получаем информацию по id-ам из constraintaTable
INNER JOIN
( // Получение последних идентификаторов на дату с дополнительными условиями
SELECT
dbTable.id,
max(dbTable.data)
FROM dbTable
WHERE dbTable.data < @someDate
// AND дополнительные условия на отбор по данным таблицы
[b]GROUP BY dbTable.id[/b]
) AS constraintTable
ON srcTable.id = constraintTable.id
AND srcTable.data = constraintTable.data
Можно построить индекс и отбор по полю дата, можно без индекса найти последнюю запись и идти назад по условию. При работе с ДБФ легко в Visual Foxpro, да и в 1С реализуется, если я правильно понял задание.
// Входные параметры:
// @someDate: DATETIME
SELECT
srcTable.id
,srcTable.Name
,srcTable.someOtherProperty
,srcTable.Date AS [Дата последнего изменения]
,@someDate AS [Дата среза]
FROM
dbTable AS srcTable // отсюда получаем информацию по id-ам из constraintaTable
INNER JOIN
( // Получение последних идентификаторов на дату с дополнительными условиями
SELECT
dbTable.id,
max(dbTable.data)
FROM dbTable
WHERE dbTable.data < @someDate
AND дополнительные условия на отбор по данным таблицы
) AS constraintTable
ON srcTable.id = constraintTable.id
AND srcTable.data = constraintTable.data
// Входные параметры:
// @someDate: DATETIME
SELECT
srcTable.id
,srcTable.Name
,srcTable.someOtherProperty
,srcTable.Date AS [Дата последнего изменения]
,@someDate AS [Дата среза]
FROM
dbTable AS srcTable // отсюда получаем информацию по id-ам из constraintaTable
INNER JOIN
( // Получение последних идентификаторов на дату с дополнительными условиями
SELECT
dbTable.id,
max(dbTable.data)
FROM dbTable
WHERE dbTable.data < @someDate
// AND дополнительные условия на отбор по данным таблицы
[b]GROUP BY dbTable.id[/b]
) AS constraintTable
ON srcTable.id = constraintTable.id
AND srcTable.data = constraintTable.data
SELECT
dbTable.id,
max(dbTable.data)
FROM dbTable
WHERE dbTable.data < @someDate
Апну тему
SELECT
id,
id_chel,
mesto_raboty,
data
FROM
table AS table
INNER JOIN
(
SELECT
Max(Data) AS data,
id_chel
FROM
table AS table
GROUP BY
id_chel
) AS filter
ON table.id_chel = filter.id_chel
AND table.data = filter.data
Vofka @ 11.10.10, 8:25
,
А можно воспользоваться оконной аналитической функцией FIRST_VALUE
--Создание временной таблицы с начальными данными, предварительно проверив временную таблицу на существование
IF OBJECT_ID(N'tempdb..#InitialData', N'U') IS NOT NULL DROP TABLE dbo.#InitialData
SELECT 1 id, 'Петров' id_chel, 'ЧП "У Васи"' mesto_raboty, CONVERT(date, '2010.10.01', 121) [data]
INTO #InitialData
UNION ALL
SELECT 2 id, 'Иванов' id_chel, 'ЧП "У Пети"' mesto_raboty, CONVERT(date, '2010.10.01', 121) [data]
UNION ALL
SELECT 3 id, 'Петров' id_chel, 'ЧП "У Коли"' mesto_raboty, CONVERT(date, '2010.10.05', 121) [data]
--дата среза
DECLARE @date date = '2010.10.02'
--Требуемый запрос
SELECT DISTINCT
t.id_chel
, FIRST_VALUE(t.mesto_raboty) OVER (PARTITION BY t.id_chel ORDER BY t.[data] DESC) as last_mesto_raboty
, FIRST_VALUE(t.[data]) OVER (PARTITION BY t.id_chel ORDER BY t.[data] DESC) as last_data_raboty
FROM dbo.#InitialData AS t
WHERE t.[data] <= @date
--Удаление временной таблицы после использования
IF OBJECT_ID(N'tempdb..#InitialData', N'U') IS NOT NULL DROP TABLE dbo.#InitialData
-- с использованием CTE
--дата среза
DECLARE @date date = '2010.10.05'
;WITH
InitialData AS (
--таблица с начальными данными
SELECT 1 id, 'Петров' id_chel, 'ЧП "У Васи"' mesto_raboty, CONVERT(date, '2010.10.01', 121) [data] UNION ALL
SELECT 2 id, 'Иванов' id_chel, 'ЧП "У Пети"' mesto_raboty, CONVERT(date, '2010.10.01', 121) [data] UNION ALL
SELECT 3 id, 'Петров' id_chel, 'ЧП "У Коли"' mesto_raboty, CONVERT(date, '2010.10.05', 121) [data]
)
--Требуемый запрос
SELECT DISTINCT
t.id_chel
, FIRST_VALUE(t.mesto_raboty) OVER (PARTITION BY t.id_chel ORDER BY t.[data] DESC) as last_mesto_raboty
, FIRST_VALUE(t.[data]) OVER (PARTITION BY t.id_chel ORDER BY t.[data] DESC) as last_data_raboty
FROM dbo.#InitialData AS t
WHERE t.[data] <= @date
FROM dbo.#InitialData AS t
FROM InitialData AS t
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua