gpt4 book ai didi

SQL获取日期列表以及之前和之后的天数而不重复

转载 作者:行者123 更新时间:2023-12-01 12:00:20 25 4
gpt4 key购买 nike

我需要显示表格中的日期列表

SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 10, 2010 - 1

没问题。但是,我现在需要使用不同的 DateType 显示之前和之后的日期。

Dec 31, 2009 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 2

我以为我可以使用联合

SELECT MyDate, DateType
FROM (
SELECT mydate - 1 AS MyDate, 2 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

UNION

SELECT mydate + 1 AS MyDate, 2 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

UNION

SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;
) AS myCombinedDateTable

但这包括原始日期的重复。

Dec 31, 2009 - 2
Jan 1, 2010 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 2
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 2

我怎样才能最好地删除这些重复项?我正在考虑使用临时表,但不确定这是否是最好的方法。

在我看来,这也可能会带来性能问题,因为我在三个不同的时间运行相同的查询。

处理此请求的最佳方式是什么?

最佳答案

这应该适合你:

SELECT MyDate, min(DateType) as DateType
FROM (
SELECT mydate - 1 AS MyDate, 2 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

UNION

SELECT mydate + 1 AS MyDate, 2 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

UNION ALL

SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;
) AS myCombinedDateTable
group by MyDate

注意:我将第二个 UNION 更改为 UNION ALL 以获得更好的性能;最后一个子查询永远不会与前两个子查询重复,因为前两个子查询的 DateType 始终为 2,最后一个 UNIONed 查询始终为 1。

关于SQL获取日期列表以及之前和之后的天数而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com