February 5, 2023 at 9:08 pm
That was going to be one of my other tests (and still will be to just to see what happens on different machines). Like I said, this has turned out to be a really interesting thread. Thanks for all the code and the testing, Jonathan.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 5, 2023 at 10:18 pm
It is nice to see so many posts that offering different solutions, as well as the performance analysis.
Regarding the real case scenario in my situation, I would expect to see about a few hundreds of events that could be activated/deactivated, and normally it shouldn't have more than three rows per event, i.e. Inactivate first, then reactivate, and finally inactivated.
However, I would definitely following Jonathan's sample test code to run it in my environment. It is a valuable learning experience.
Again, thank you all for your suggestions and advices.
-Jay
February 6, 2023 at 3:09 am
It is nice to see so many posts that offering different solutions, as well as the performance analysis.
Regarding the real case scenario in my situation, I would expect to see about a few hundreds of events that could be activated/deactivated, and normally it shouldn't have more than three rows per event, i.e. Inactivate first, then reactivate, and finally inactivated.
However, I would definitely following Jonathan's sample test code to run it in my environment. It is a valuable learning experience.
Again, thank you all for your suggestions and advices.
-Jay
I'm just getting off of work and haven't tried the code yet but, looking at the code that Jonathan wrote to create a substantial set of test data, I have to say he did an awesome job. It DOES require the fnTally function. If you don't have that or one like it that you could substitute for, you can get a version at the following URL. Heh... I can vouch for the guy who wrote it. 😀
https://www.sqlservercentral.com/scripts/create-a-tally-function-fntally
--Jeff Moden
Change is inevitable... Change for the better is not.
February 6, 2023 at 11:07 am
Just for fun I tried cutting and pasting the original question into ChatGPT, this is what it came up with. As far as I can tell it works.
You can use a self-join and conditional aggregation to achieve the desired result:
SELECT t1.EventId,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.EventStatus END) AS InactiveEvent,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.UpdatedDate END) AS InactivateDate,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.EventStatus END) AS ReactiveEvent,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.UpdatedDate END) AS ReactivateDate
FROM #tbSourceData t1
LEFT JOIN #tbSourceData t2
ON t1.EventId = t2.EventId
AND t1.RowNum + 1 = t2.RowNum
GROUP BY t1.EventId, t1.RowNum
HAVING MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.EventStatus END) = 'InActive'
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537February 6, 2023 at 6:27 pm
Can you post the actual question that you asked it? I'm curious as to how much it needed to know.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 6, 2023 at 6:42 pm
Can you post the actual question that you asked it? I'm curious as to how much it needed to know.
Literally all of the original question starting with "I have a table" and ending with the sample data, "Insert Into #tbSourceData..."
Try it yourself.
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537February 6, 2023 at 6:59 pm
Can you post the actual question that you asked it? I'm curious as to how much it needed to know.
I just tried pasting the entire question, including the "Hi" and it gave me this answer:
SELECT t1.EventId,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.EventStatus END) AS InactiveEvent,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.UpdatedDate END) AS InactivateDate,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.EventStatus END) AS ReactiveEvent,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.UpdatedDate END) AS ReactivateDate
FROM #tbSourceData t1
LEFT JOIN #tbSourceData t2
ON t1.EventId = t2.EventId AND t1.RowNum = t2.RowNum - 1
GROUP BY t1.EventId, t1.RowNum
ORDER BY t1.EventId, t1.RowNum;
I then said "can you indent the answer?" and it gave me this:
SELECT t1.EventId,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.EventStatus END) AS InactiveEvent,
MAX(CASE WHEN t1.EventStatus = 'InActive' THEN t1.UpdatedDate END) AS InactivateDate,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.EventStatus END) AS ReactiveEvent,
MAX(CASE WHEN t2.EventStatus = 'ReActive' THEN t2.UpdatedDate END) AS ReactivateDate
FROM #tbSourceData t1
LEFT JOIN #tbSourceData t2
ON t1.EventId = t2.EventId AND t1.RowNum = t2.RowNum - 1
GROUP BY t1.EventId, t1.RowNum
ORDER BY t1.EventId, t1.RowNum;
I then said "can you solve it using LEAD?"
Its answer:
SELECT EventId,
EventStatus AS InactiveEvent,
UpdatedDate AS InactivateDate,
LEAD(EventStatus) OVER (PARTITION BY EventId ORDER BY UpdatedDate) AS ReactiveEvent,
LEAD(UpdatedDate) OVER (PARTITION BY EventId ORDER BY UpdatedDate) AS ReactivateDate
FROM #tbSourceData
WHERE EventStatus = 'InActive'
ORDER BY EventId, UpdatedDate;
It's not quite correct but give it a few more releases it will be doing common program tasks for us.
There is a certain amount of randomness built into its answers so if you ask it the same question at a later date it might give you a different answer and a different way of solving the solution.
February 6, 2023 at 10:26 pm
There is a certain amount of randomness built into its answers so if you ask it the same question at a later date it might give you a different answer and a different way of solving the solution.
Thanks, Jonathan. I have the same issue with people I work with. 😀 😀 😀
--Jeff Moden
Change is inevitable... Change for the better is not.
February 6, 2023 at 10:34 pm
The next question should be, "How can that be optimized for performance"?
I'm actually impressed with its responses that you posted above. Impressed enough where I'm not actually going to try it. It'll also be interesting to see how it reacts to people that don't actually know how to ask such questions (as we've seen before) but I'm not going to be the one to test that.
As a bit of a sidebar, it's interesting that people asking such questions of it will also probably be the first to be replaced by it. 😀 Me? I could have retired 5 years ago... 😀 The reason I haven't is because this kind of stuff is good for the brain. 😀
--Jeff Moden
Change is inevitable... Change for the better is not.
February 6, 2023 at 10:38 pm
On second thought, I DO have a couple of interesting questions to ask it to see how it does... especially when it comes to answers that actually preform well. And, yeah... I'm going to add it's answer to the testing I do on this using Jonathan's excellent data generator he built for this thread.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 7, 2023 at 1:29 am
I'm officially "dead" with ChatGPT. It never asked me for a password when I first setup my login. I logged out and told it I forgot my password when I tried to log back in. I said it sent me instructions to my email address. I never got such an email and, yes, I checked the spam locker. I asked to resend. Still nothing.
While I was in, I asked it how to count from 1 to a million in t-sql. It gave me the usual answer of using a recursive CTE. It didn't include a MAXRecursion option and so it failed. I asked how to do it without an rCTE. It said to use a numbers table and then provided the same wrong rCTE to build the numbers table and without an index.
I also asked it to convert and adjacency list to nested sets. It provided a recursive CTE that kinda looked right but it didn't create the left or right bowers correctly. I asked it to do it without an rCTE and it produced the old push-stack code but it didn't create the bowers correctly either. On the rCTE method, it also created and accidental Cross Join in the rCTE.
I've not yet had a chance to evaluate the code that it wrote for the problem on this thread.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 7, 2023 at 1:59 am
I'm officially "dead" with ChatGPT. It never asked me for a password when I first setup my login. I logged out and told it I forgot my password when I tried to log back in. I said it sent me instructions to my email address. I never got such an email and, yes, I checked the spam locker. I asked to resend. Still nothing.
While I was in, I asked it how to count from 1 to a million in t-sql. It gave me the usual answer of using a recursive CTE. It didn't include a MAXRecursion option and so it failed. I asked how to do it without an rCTE. It said to use a numbers table and then provided the same wrong rCTE to build the numbers table and without an index.
I also asked it to convert and adjacency list to nested sets. It provided a recursive CTE that kinda looked right but it didn't create the left or right bowers correctly. I asked it to do it without an rCTE and it produced the old push-stack code but it didn't create the bowers correctly either. On the rCTE method, it also created and accidental Cross Join in the rCTE.
I've not yet had a chance to evaluate the code that it wrote for the problem on this thread.
I asked it "generate numbers 1 to a million in t-sql"
It came back with this:
WITH Nums AS (
SELECT 1 AS Num
UNION ALL
SELECT Num + 1
FROM Nums
WHERE Num < 1000000
)
SELECT Num
FROM Nums
OPTION (MAXRECURSION 0);
I then asked "Do it using the same method Jeff Moden would use"
It returned this (I've screenshot it just in case you don't believe it):
I then told it master..spt_values only had 2553 rows then this:
So eventually with a bit of prodding it arrived at a good answer.
February 7, 2023 at 2:59 am
I figured out how to get back in and it had saved my questions and answers.
Here was my first question and it's answer... note the lack of the MAXRECURSION option...
Then I asked it the same question but how to do it without a CTE.. notice anything familiar? {headdesk}
So, I asked the same question but asked it not to use a CTE or a numbers table... are you as impressed with the WHERE clause as I was? {headdesk}{headdesk}{headdesk}
It was definitely in the ball park but it couldn't find the pitcher's mound. 😀 I have to admit that I'm impressed with the technology but I'm concerned that people that don't know things (other than testing, why would they be asking) are going to take this information as gospel rather than remembering the disclaimers in the user agreement (that I read top to bottom)
The really good part about all this is it will help keep interviews of candidates applying for SQL positions really short.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 7, 2023 at 3:08 am
You should have just asked it "How would Jeff Moden do it" - LOL
February 7, 2023 at 3:09 am
I then asked "Do it using the same method Jeff Moden would use"
It returned this (I've screenshot it just in case you don't believe it):
BWAAA-HAAA-HAAA!!!! I just read what it returned. That's hilarious (I think it was just telling you what your wanted to hear by using the name you supplied because I've used that table maybe just a couple of times in my life) and humbling at the same time. Thanks for posting it. 😀
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 15 posts - 16 through 30 (of 38 total)
You must be logged in to reply to this topic. Login to reply