Sql 为多个字段选择DISTINCT
在我的表中,我有Sql 为多个字段选择DISTINCT,sql,Sql,在我的表中,我有Collection\u Date和Tag\u Date字段,这两个字段的类型都是Date 我需要查询此表,将每个日期分为其组成部分月、日和年,但仍保留收集日期日期和标记日期日期之间的区别,我不希望重复 我试过这个: SELECT DISTINCT MONTH(Collection_Date) AS col_month, DAY(Collection_Date) AS col_day, YEAR(Collection_Date) AS col_year,
Collection\u Date
和Tag\u Date
字段,这两个字段的类型都是Date
我需要查询此表,将每个日期分为其组成部分月、日和年,但仍保留收集日期
日期和标记日期
日期之间的区别,我不希望重复
我试过这个:
SELECT DISTINCT
MONTH(Collection_Date) AS col_month,
DAY(Collection_Date) AS col_day,
YEAR(Collection_Date) AS col_year,
MONTH(Tag_Date) AS tag_month,
DAY(Tag_Date) AS tag_day,
YEAR(Tag_Date) AS tag_year
FROM the_table
但是,这仅返回具有唯一的集合日期
和标记日期
的行
我想把它分成两个查询,一个是选择DISTINCT
ingCollection\u Date
,另一个是Tag\u Date
。但是,如果可能的话,我真的希望避免多次查询
我怎样才能做到这一点呢?我很确定你必须把它分开。下面将返回一个合并的结果集,但实际上是两个单独的查询连接在一起
SELECT MONTH(Collection_Date) AS m,
DAY(Collection_Date) AS d,
YEAR(Collection_Date) AS y
UNION --For the DISTINCT
SELECT MONTH(Tag_Date) AS m,
DAY(Tag_Date) AS d,
YEAR(Tag_Date) AS y
或者现在有了一些额外的区别。它将返回不同的日期和一个类型字段,指示该日期是引用标记还是引用集合,还是同时引用两者
WITH the_table AS
(
SELECT
CAST('2010-06-23 00:00:00.000' AS DATETIME) AS Collection_Date,
CAST('2010-06-22 00:00:00.000' AS DATETIME) AS Tag_Date
UNION ALL
SELECT
CAST('2010-06-25 00:00:00.000' AS DATETIME) AS Collection_Date,
CAST('2010-06-23 00:00:00.000' AS DATETIME) AS Tag_Date
)
SELECT
MONTH(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS m,
DAY(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS d,
YEAR(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS y,
CASE WHEN T1.Collection_Date IS NOT NULL AND T2.Collection_Date IS NOT NULL THEN 'Both'
WHEN T1.Collection_Date IS NOT NULL THEN 'Collection'
ELSE 'Tag' END
AS 'Type'
FROM the_table t1
FULL OUTER JOIN the_table t2
ON T1.Collection_Date = T2.Tag_Date
返回
m d y Type
----------- ----------- ----------- ----------
6 22 2010 Tag
6 23 2010 Both
6 25 2010 Collection
此查询将返回所有唯一的集合日期和标记日期。如果集合日期与标记日期相同,则两者都将返回。查询还返回它是哪种类型的日期:
SELECT DISTINCT MONTH(Collection_Date) AS m,
DAY(Collection_Date) AS d,
YEAR(Collection_Date) AS y
'collection_date' AS dateType
FROM the_table
UNION ALL
SELECT DISTINCT MONTH(Tag_Date) AS m,
DAY(Tag_Date) AS d,
YEAR(Tag_Date) AS y,
'tag_date' AS dateType
FROM the_table
如果您只需要一个标记日期或集合日期,而它们有一个共同的日期,那么您可以使用
SELECT m, d, y, MIN(dateType) FROM (
SELECT MONTH(Collection_Date) AS m,
DAY(Collection_Date) AS d,
YEAR(Collection_Date) AS y
'collection_date' AS dateType
FROM the_table
UNION ALL
SELECT MONTH(Tag_Date) AS m,
DAY(Tag_Date) AS d,
YEAR(Tag_Date) AS y,
'tag_date' AS dateType
FROM the_table
) data
GROUP BY m, d, y
但您要求的是一个不同的列表,因此您将删除其中一个对应的行。我添加了一个包含类型字段的新版本。如果collection_date和tag_date相同,您希望两者都返回还是仅返回一个,如果仅返回一个,则返回哪一个?