Set column value based on another column's value
I have a table that contains 4 columns:
ItemId, ItemPrice, DateFrom, DateTo
The table contains information about items, their prices and the day that the prices changed
for example:
What I want to do, is to fill the DateTo column so I know what for how long the price has lasted and if it still lasts
The results I expect:
An important note is also that the count of the price changes is unknown, for some items it changes 3 times and for some it doesn't change at all and the price remains unchanged until this day.
Any kind of help will be greatly appreciated.
sql sql-server tsql
add a comment |
I have a table that contains 4 columns:
ItemId, ItemPrice, DateFrom, DateTo
The table contains information about items, their prices and the day that the prices changed
for example:
What I want to do, is to fill the DateTo column so I know what for how long the price has lasted and if it still lasts
The results I expect:
An important note is also that the count of the price changes is unknown, for some items it changes 3 times and for some it doesn't change at all and the price remains unchanged until this day.
Any kind of help will be greatly appreciated.
sql sql-server tsql
add a comment |
I have a table that contains 4 columns:
ItemId, ItemPrice, DateFrom, DateTo
The table contains information about items, their prices and the day that the prices changed
for example:
What I want to do, is to fill the DateTo column so I know what for how long the price has lasted and if it still lasts
The results I expect:
An important note is also that the count of the price changes is unknown, for some items it changes 3 times and for some it doesn't change at all and the price remains unchanged until this day.
Any kind of help will be greatly appreciated.
sql sql-server tsql
I have a table that contains 4 columns:
ItemId, ItemPrice, DateFrom, DateTo
The table contains information about items, their prices and the day that the prices changed
for example:
What I want to do, is to fill the DateTo column so I know what for how long the price has lasted and if it still lasts
The results I expect:
An important note is also that the count of the price changes is unknown, for some items it changes 3 times and for some it doesn't change at all and the price remains unchanged until this day.
Any kind of help will be greatly appreciated.
sql sql-server tsql
sql sql-server tsql
edited Nov 22 '18 at 12:26
mjohansen
asked Nov 22 '18 at 12:25
mjohansenmjohansen
213
213
add a comment |
add a comment |
5 Answers
5
active
oldest
votes
A view would be far better solution to this, as there's no need to have a AFTER UPDATE
trigger, and you can't persist a column with the value GETDATE()
(thus you would have to update the value of DateTo
at the start of every day). This will get you the result you are after:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
add a comment |
Try below query - Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
DoingSELECT top 1
withoutORDER BY
makes no sense: it will give unpredictable (quasi-random) results.
– Peter B
Nov 22 '18 at 13:03
add a comment |
You need to set the DateTo
of each record to "the smallest of all From-dates (for the same ItemId
) that are bigger than its own DateFrom
, minus 1 day".
And for those where it couldn't be found, set it to GetDate().
In SQL:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
Or combined into one step:
UPDATE PriceTable
SET DateTo = (SELECT ISNULL(DATEADD(d, -1, MIN(DateFrom)), GETDATE())
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
add a comment |
You can create date_to column on adhoc basic as you see. below
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
You can update value as
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
add a comment |
For future add trigger who update dateTo
on insert new row, now you must select previous value DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value ofDateTo
is set toGETDATE()
it'll be stale after (at most) 24 hours.
– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something likeIFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in theSELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.
– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
|
show 2 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430982%2fset-column-value-based-on-another-columns-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
A view would be far better solution to this, as there's no need to have a AFTER UPDATE
trigger, and you can't persist a column with the value GETDATE()
(thus you would have to update the value of DateTo
at the start of every day). This will get you the result you are after:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
add a comment |
A view would be far better solution to this, as there's no need to have a AFTER UPDATE
trigger, and you can't persist a column with the value GETDATE()
(thus you would have to update the value of DateTo
at the start of every day). This will get you the result you are after:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
add a comment |
A view would be far better solution to this, as there's no need to have a AFTER UPDATE
trigger, and you can't persist a column with the value GETDATE()
(thus you would have to update the value of DateTo
at the start of every day). This will get you the result you are after:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
A view would be far better solution to this, as there's no need to have a AFTER UPDATE
trigger, and you can't persist a column with the value GETDATE()
(thus you would have to update the value of DateTo
at the start of every day). This will get you the result you are after:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
answered Nov 22 '18 at 12:30
LarnuLarnu
17.1k41630
17.1k41630
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
add a comment |
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
This works exactly as I needed it to work, thank you so much!
– mjohansen
Nov 22 '18 at 12:57
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
You're welcome @mjohansen . Please remember to mark the answer as a solution if so, so that others with the same/similar question know it helped you. Thanks.
– Larnu
Nov 22 '18 at 13:00
add a comment |
Try below query - Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
DoingSELECT top 1
withoutORDER BY
makes no sense: it will give unpredictable (quasi-random) results.
– Peter B
Nov 22 '18 at 13:03
add a comment |
Try below query - Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
DoingSELECT top 1
withoutORDER BY
makes no sense: it will give unpredictable (quasi-random) results.
– Peter B
Nov 22 '18 at 13:03
add a comment |
Try below query - Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
Try below query - Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
answered Nov 22 '18 at 12:49
ZerotoinfinityZerotoinfinity
2,2032098175
2,2032098175
DoingSELECT top 1
withoutORDER BY
makes no sense: it will give unpredictable (quasi-random) results.
– Peter B
Nov 22 '18 at 13:03
add a comment |
DoingSELECT top 1
withoutORDER BY
makes no sense: it will give unpredictable (quasi-random) results.
– Peter B
Nov 22 '18 at 13:03
Doing
SELECT top 1
without ORDER BY
makes no sense: it will give unpredictable (quasi-random) results.– Peter B
Nov 22 '18 at 13:03
Doing
SELECT top 1
without ORDER BY
makes no sense: it will give unpredictable (quasi-random) results.– Peter B
Nov 22 '18 at 13:03
add a comment |
You need to set the DateTo
of each record to "the smallest of all From-dates (for the same ItemId
) that are bigger than its own DateFrom
, minus 1 day".
And for those where it couldn't be found, set it to GetDate().
In SQL:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
Or combined into one step:
UPDATE PriceTable
SET DateTo = (SELECT ISNULL(DATEADD(d, -1, MIN(DateFrom)), GETDATE())
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
add a comment |
You need to set the DateTo
of each record to "the smallest of all From-dates (for the same ItemId
) that are bigger than its own DateFrom
, minus 1 day".
And for those where it couldn't be found, set it to GetDate().
In SQL:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
Or combined into one step:
UPDATE PriceTable
SET DateTo = (SELECT ISNULL(DATEADD(d, -1, MIN(DateFrom)), GETDATE())
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
add a comment |
You need to set the DateTo
of each record to "the smallest of all From-dates (for the same ItemId
) that are bigger than its own DateFrom
, minus 1 day".
And for those where it couldn't be found, set it to GetDate().
In SQL:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
Or combined into one step:
UPDATE PriceTable
SET DateTo = (SELECT ISNULL(DATEADD(d, -1, MIN(DateFrom)), GETDATE())
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
You need to set the DateTo
of each record to "the smallest of all From-dates (for the same ItemId
) that are bigger than its own DateFrom
, minus 1 day".
And for those where it couldn't be found, set it to GetDate().
In SQL:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
Or combined into one step:
UPDATE PriceTable
SET DateTo = (SELECT ISNULL(DATEADD(d, -1, MIN(DateFrom)), GETDATE())
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
answered Nov 22 '18 at 13:01
Peter BPeter B
12.9k51941
12.9k51941
add a comment |
add a comment |
You can create date_to column on adhoc basic as you see. below
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
You can update value as
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
add a comment |
You can create date_to column on adhoc basic as you see. below
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
You can update value as
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
add a comment |
You can create date_to column on adhoc basic as you see. below
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
You can update value as
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
You can create date_to column on adhoc basic as you see. below
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
You can update value as
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
answered Nov 22 '18 at 13:10
kiran gadhekiran gadhe
62617
62617
add a comment |
add a comment |
For future add trigger who update dateTo
on insert new row, now you must select previous value DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value ofDateTo
is set toGETDATE()
it'll be stale after (at most) 24 hours.
– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something likeIFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in theSELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.
– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
|
show 2 more comments
For future add trigger who update dateTo
on insert new row, now you must select previous value DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value ofDateTo
is set toGETDATE()
it'll be stale after (at most) 24 hours.
– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something likeIFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in theSELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.
– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
|
show 2 more comments
For future add trigger who update dateTo
on insert new row, now you must select previous value DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1
For future add trigger who update dateTo
on insert new row, now you must select previous value DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1
edited Nov 22 '18 at 12:59
answered Nov 22 '18 at 12:30
bato3bato3
877617
877617
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value ofDateTo
is set toGETDATE()
it'll be stale after (at most) 24 hours.
– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something likeIFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in theSELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.
– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
|
show 2 more comments
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value ofDateTo
is set toGETDATE()
it'll be stale after (at most) 24 hours.
– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something likeIFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in theSELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.
– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value of
DateTo
is set to GETDATE()
it'll be stale after (at most) 24 hours.– Larnu
Nov 22 '18 at 12:35
This doesn't give the OP an answer; it gives them an idea. Also, how does this solve the problem when there is no next value? If the default value of
DateTo
is set to GETDATE()
it'll be stale after (at most) 24 hours.– Larnu
Nov 22 '18 at 12:35
@Larnu updated answer, And it should add something like
IFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
@Larnu updated answer, And it should add something like
IFNULL(_QUERY_, GETDATE())
– bato3
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in the
SELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.– Larnu
Nov 22 '18 at 12:44
That query won't run I'm afraid; for example a subquery in the
SELECT
needs to be wrapped in paranthesis(()
). It also doesn't cater the latest value and (a valid) query would result in 3 scans of the table; which seems a little over kill.– Larnu
Nov 22 '18 at 12:44
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
My mistake is that I give a solution hint for MySQL. And you can reduce the number of scans to 2, but then you are not sure about the correctness of the returned data
– bato3
Nov 22 '18 at 12:49
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
This is a SQL Server question, not MySQL.
– Larnu
Nov 22 '18 at 12:50
|
show 2 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430982%2fset-column-value-based-on-another-columns-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown