2015-04-07 3 views
0

У меня есть таблица истории со следующими значениямиПолучить новое измененное значение из истории Таблица

CREATE TABLE History (SnapShotDate DATETIME, UID VARCHAR(10), DUEDATE DATETIME) 

INSERT INTO History VALUES ('03-23-2015','PT-01','2015-04-22') 
INSERT INTO History VALUES ('03-30-2015','PT-01','2015-04-20') 
INSERT INTO History VALUES ('04-06-2015','PT-01','2015-06-30') 

INSERT INTO History VALUES ('03-23-2015','PT-02','2015-04-22') 
INSERT INTO History VALUES ('03-30-2015','PT-02','2015-04-22') 
INSERT INTO History VALUES ('04-06-2015','PT-02','2015-04-22') 

INSERT INTO History VALUES ('03-23-2015','PT-03','2015-04-18') 
INSERT INTO History VALUES ('03-30-2015','PT-03','2015-04-22') 
INSERT INTO History VALUES ('04-06-2015','PT-03','2015-04-22') 

мне нужен выход в указанном ниже формате. Мне нужно последнее измененное значение для любого данного UID. Пожалуйста, помогите мне в получении ниже результата

ВЫХОД

UID PreviousDueDate CurrentDueDate 
---------------------------------------- 
PT-01  2015-04-20  2015-06-30 
PT-02  2015-04-22  2015-04-22 
PT-03  2015-04-18  2015-04-22 

Thanks

+0

Если у вас есть тип данных столбцов даты как varchar (как указано в одном из ваших комментариев), почему вы поставили datetime в инструкции create table? Это не помогает людям, которые пытаются вам помочь. – wonderbell

ответ

0

Вы можете попробовать с этим SQL:

select UID,date_format(min(DUEDATE), '%Y-%m-%d') as PreviousDueDate,date_format(max(DUEDATE), '%Y-%m-%d') as CurrentDueDate from History group by UID; 
+0

Я получаю эту ошибку при выполнении запроса, который вы указали Msg 195, уровень 15, состояние 10, строка 3 «date_format» не является признанным встроенным именем функции. – swat

+0

date_format - это функция MySQL для форматирования даты. Если вы не используете MySQL, вы можете опустить эту часть формата – sayani

+0

Мне нужен q-запрос, который дает данные, проверяя SnapshotDate. Иногда CurrentDue Значение даты может быть меньшее значение, чем предыдущие из-за date' – swat

0
SELECT UID, 
(SELECT DUEDATE FROM History WHERE SnapShotDate=(SELECT MIN(SnapShotDate) FROM History h2 WHERE h2.UID=h1.UID))AS PreviousDueDate 
(SELECT DUEDATE FROM History WHERE SnapShotDate=(SELECT MAX(SnapShotDate) FROM History WHERE h2.UID=h1.UID))AS CurrentDueDate 
FROM History h1 
GROUP BY UID 
+0

Хмм Это не будет работать, когда запись что-то вроде этого INSERT INTOHistory VALUES ('03 -23-2015' , 'PT- 04' , '2015-04-20') ВСТАВИТЬ INTOHistory ЗНАЧЕНИЯ ('03 -30-2015' , 'СТ-04', '2015-04-22') ВСТАВИТЬ INTOHistory VALUES ('0 4-06-2015 ',' PT-04 ',' 2015-04-18 ') Мне нужен запрос, который использует дату истории и выбирает последний измененный. Мне нужно применить эту логику для аналогичного требования, которое имеет текстовый столбец вместо duedate. – swat

+0

i edit my answer – user4002899

+0

Когда вы группируете UID в подзапросе, он возвращает более одного значения и дает мне эту ошибку. Подзапрос возвращает более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <= , >,> = или когда подзапрос используется как выражение. . Пожалуйста, предоставьте мне запрос, где я могу использовать эту логику для текстовых столбцов, в отличие от Duedate. – swat

0

Вы должны использовать Преобразовать функцию в SQL сервере ,

SELECT A.UID 
,CONVERT(varchar(10),B.DUEDATE, 20) as PreviousDueDate 
,CONVERT(varchar(10),A.DUEDATE, 20) as CurrentDueDate 
FROM 
(
    SELECT *,row_number() OVER(PARTITION BY UID ORDER BY SnapShotDate DESC) AS ROWID 
    FROM History 
)A 
LEFT JOIN 
(
    SELECT *,row_number() OVER(PARTITION BY UID ORDER BY SnapShotDate DESC) AS ROWID 
    FROM History 
)B ON A.UID=B.UID AND B.ROWID=2 
WHERE A.ROWID=1 
GROUP BY A.UID,A.DUEDATE,B.DUEDATE 

Выход:

UID  PreviousDueDate CurrentDueDate 
PT-01 2015-04-20  2015-06-30 
PT-02 2015-04-22  2015-04-22 
PT-03 2015-04-22  2015-04-22 
PT-04 2015-04-22  2015-04-18 
+0

Это не сработает, если последняя измененная дата погашения меньше предыдущей даты выполнения?Не могли бы вы предоставить мне запрос, который использовал дату моментального снимка и проверил для последнего измененного значения. Мне нужен этот запрос для применения в текстовом столбце так же, как я делаю для Due date прямо сейчас. – swat

+0

. Предыдущее значение даты PT-03 должно быть «2015-04-22», а не «2015-04-18». –

0

Я никогда не использовал функцию LAG перед таким образом, но, кажется, просто супер !!!

; WITH CTE AS (
    SELECT UID, 
    LAG(DUEDATE,1,NULL) OVER (PARTITION BY UID ORDER BY SnapShotDate ASC) AS PreviousDueDate, 
    DUEDATE AS CurrentDueDate, 
    ROW_NUMBER() OVER (PARTITION BY UID ORDER BY SnapShotDate DESC) AS RowNumber 
    FROM History 
) 
SELECT UID, PreviousDueDate, CurrentDueDate 
FROM CTE 
WHERE ROWNUMBER = 1 

Вот fiddle.

+0

Для записи PT-03 предыдущая дата исполнения должна быть 2015-04-18, которую я не получаю от вашего решения – swat

0
SELECT UID, 
(SELECT MIN(DUEDATE) FROM History HS WHERE HS.UID = H.UID GROUP BY UID)AS PreviousDueDate, 
(SELECT Max(DUEDATE) FROM History HS WHERE HS.UID = H.UID GROUP BY UID)AS CurrentDueDate 
FROM History H 
GROUP BY UID 
Смежные вопросы