我有一个datetime列,我想从此列中删除重复的“ DATES”。
现有列的数据类型为datetimeoffset(7):
2018-06-17 00:44:13.0000000 +00:00
我现在可以像这样提取日期:
SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) FROM [dbo].[myTable]
where mycondition = 1223445
这给了我这样的一列:
(No column name)
2018.06.18
2018.06.17
2018.06.16
.... and so on
现在我正试图给这个新列起一个名字,所以我可以在此列上使用“ ORDER BY”对结果进行排序。第一个问题,我该怎么做,我正在尝试以下操作并获得语法错误:
select newcolumn from(
(SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) FROM [dbo].[myTable]
where mycondition = 1223445) as newcolumn
order by newcolumn desc
第二个问题:我如何以一种简单的方式从结果集中删除重复的日子,我试图避免使用冗长而复杂的表达式/公式?
tnx:)
答案 0 :(得分:4)
只需按数量/列或别名直接排序:
SELECT
CONVERT(VARCHAR(10), mytimestamp_column, 102) AS col
FROM [dbo].[myTable]
WHERE mycondition = 1223445
ORDER BY
col DESC;
您实际上不需要在这里进行子查询。
答案 1 :(得分:3)
在您的查询中newcolumn是一个表(子查询)别名而不是列别名,您必须以以下方式编写查询
select * from
(
(SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) as col -- column alias
FROM [dbo].[myTable]
where mycondition = 1223445
) as newcolumn --subquery name
order by col desc
答案 2 :(得分:2)
您可以使用Row_Number
进行尝试,如下所示。
DELETE A FROM(
SELECT
Row_Number() Over(Partition By mytimestamp_column Order By
mytimestamp_column) as RN, CONVERT(VARCHAR(10), mytimestamp_column, 102) as
NewColumn
FROM [dbo].[myTable]
--where mycondition = 1223445) as newcolumn
)A where RN > 1
您可以找到演示Here。
答案 3 :(得分:1)
使用通用表表达式来创建类似于模式的表,并将其用于进一步查询。
GO
;WITH CTE AS
(
SELECT Row_Number() Over(Partition By mytimestamp_column Order By
mytimestamp_column) as Slno, CONVERT(VARCHAR(10), mytimestamp_column, 102) as newcolumn
FROM [dbo].[myTable] where mycondition = 1223445)
Select * from cte where Slno>1 order by newcolumn desc
GO
答案 4 :(得分:1)
只需将值转换为日期即可提取日期:
convert(date, mytimestamp_column)
如:
order by convert(date, mytimestamp_column)
要从结果集中中删除重复项,请使用窗口函数:
select newcolumn
from (select t.*,
convert(date, mytimestamp_column) as mydate,
row_number() over (partition by convert(date, mytimestamp_column) order by mytimestamp_column) as seqnum
from t
where mycondition = 1223445
)
where seqnum = 1;
如果要永久删除表中的行,请仅使用delete
。