选择与条件

时间:2016-03-29 07:24:39

标签: sql-server sql-server-2014

我无法获得select distinct语句的正确语法。

我无法找出正确的代码来从这个链接获得我需要的东西。

这是我现在的代码,但是当我希望将SELECT DISTINCT仅应用于column1时,它显然会选择多个日期。

SELECT DISTINCT 
    column1, column2, column3, column4, column5
FROM Table1
WHERE 
    column1 >= '2016/1/1' 
    And column1 < '2016/1/4' 
    AND column2 = 1 
    AND column3 = 1 
ORDER BY column2, column1;

这是我在Fiddle中放在一起的内容,但同样会在column1中选择多个相同的日期。老实说,我甚至不知道从这些链接构建此声明的位置。

抱歉,我从Fiddle链接到SQL Sever 2008,我正在使用2014。

编辑:添加更多信息,  这是我现在得到的结果:

January, 01 2016 00:00:00   1   1   1   4
January, 01 2016 00:00:00   1   1   5   4
January, 01 2016 00:00:00   1   1   9   4
January, 02 2016 00:00:00   1   1   2   4
January, 02 2016 00:00:00   1   1   6   4
January, 03 2016 00:00:00   1   1   3   4
January, 03 2016 00:00:00   1   1   7   4

这是我要找的结果:

January, 01 2016 00:00:00   1   1   1   4
January, 02 2016 00:00:00   1   1   2   4
January, 03 2016 00:00:00   1   1   7   4

1 个答案:

答案 0 :(得分:2)

这是一个经典的top-n-per-group问题。

一种可能的选择是使用ROW_NUMBER。您需要通过在column1子句中指定ORDER BY来确定应为OVER的每个唯一值选择哪一行。

WITH
CTE
AS
(
    SELECT
        column1, column2, column3, column4, column5
        ,ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY ...) AS rn
    FROM Table1
    WHERE 
        column1 >= '2016/1/1' 
        And column1 < '2016/1/4' 
        AND column2 = 1 
        AND column3 = 1 
)
SELECT
    column1, column2, column3, column4, column5
FROM CTE
WHERE rn = 1
ORDER BY column2, column1;

有关几种方法的详细比较,请参阅Retrieving n rows per group

相关问题