C# 从SQL Server中按月、按年、按日获取记录

C# 从SQL Server中按月、按年、按日获取记录,c#,sql,sql-server,tsql,stored-procedures,C#,Sql,Sql Server,Tsql,Stored Procedures,我正在寻找一个快速而简单的SQL查询,以便逐年、逐月、逐日地获取记录 我的数据库示例: ID - DATE - CatID - VALUE 1 - 2013-08-06 - 32 - 243 2 - 2013-08-16 - 2 - 45 3 - 2013-08-21 - 2 - 1 4 - 2013-08-05 - 32 - 450 5 - 2013-08-05 - 32 - 449 6 - 2013-08-05

我正在寻找一个快速而简单的SQL查询,以便逐年、逐月、逐日地获取记录

我的数据库示例:

ID - DATE        - CatID - VALUE
1  - 2013-08-06  -  32   -  243
2  - 2013-08-16  -  2    -  45
3  - 2013-08-21  -  2    -  1
4  - 2013-08-05  -  32   -  450
5  - 2013-08-05  -  32   -  449
6  - 2013-08-05  -  32   -  11
7  - 2013-08-01  -  2    -  221
8  - 2013-08-02  -  32   -  0
9  - 2013-08-02  -  32   -  0
10 - 2013-08-02  -  32   -  987
...
..
这张桌子上有200多万张唱片

第一:

我希望获得CatID=32和当天的单曲/更高记录

结果:

1  - 2013-08-06  -  32   -  243
4  - 2013-08-05  -  32   -  450
10 - 2013-08-02  -  32   -  987
第二:

我希望每月都能拿到同样的

如何使用SQL SERVER实现这一点。目前是Sql Server 2012

同样使用C5,如果你想使用EF6


在选民的支持下,这个问题成为了一个热门问题。现在请解释为什么投票被否决?

下面假设您不仅需要每个日期/月份的最大值,还需要知道该行的id等

每日

WITH
  sorted AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY CatID,
                                    Date
                           ORDER BY Value DESC)   AS ordinal_cat_date
  FROM
    yourTable
)
SELECT
  *
FROM
  sorted
WHERE
  ordinal_cat_date = 1
  AND catID = 32
每月

WITH
  sorted AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY CatID,
                                    DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0)
                           ORDER BY Value DESC)   AS ordinal_cat_month
  FROM
    yourTable
)
SELECT
  *
FROM
  sorted
WHERE
  ordinal_cat_month = 1
  AND catID = 32
在这两种情况下,ROW_NUMBER函数都会为catID、date的每个分区按值的降序创建数字1、2、3、4等序列。值为1的行是该分区中值最高的行

公式DATEADDMONTH,DATEDIFFMONTH,0,Date,0只是将日期向下舍入到月份的第一天,从而为整个月份创建分区

如果每天/每月有多行共享相同的最高值,则可以使用其他一些选项

SELECT  -- Daily Version
  *
FROM
  yourTable
WHERE
  NOT EXISTS (SELECT *
                FROM yourTable   AS lookup
               WHERE lookup.CatID = yourTable.CatID
                 AND lookup.Value > yourTable.Value
                 AND lookup.Date  = yourTable.Date
             )
  AND CatID = 32

这是一个超级简单的SQL问题。你试过什么吗?试过一些。例如,我不知道如何获得2014年的最大值。2014年我有200万张唱片。我想得到2014年的最大值行。其他年份也是如此……您熟悉年、月、日函数吗?非常感谢您的回答:当我为每日执行时,我得到了这个:;我想得到所有的日子。我怎么做?thanks@ErçinDedeoğlu-该屏幕截图意味着对于MeterID=3,您只有一个日期的数据。@ErçinDedeoğlu-两个观察值。1.您的字段名是MeterAddate,而不是Date,因此查询需要在分区中使用MeterAddate。2.这些不是日期,而是日期时间。如果希望按日期分配,则需要按MeterID、DATEADDDAY、DATEDIFFDAY、0、MeterAddate、0使用分区,以便将该字段四舍五入到一天的开始。
SELECT  -- Monthly Version
  *
FROM
  yourTable
WHERE
  NOT EXISTS (SELECT *
                FROM yourTable   AS lookup
               WHERE lookup.CatID  = yourTable.CatID
                 AND lookup.Value >  yourTable.Value
                 AND lookup.Date  >= DATEADD(MONTH,   DATEDIFF(MONTH, 0, yourTable.Date), 0)
                 AND lookup.Date  <  DATEADD(MONTH, 1+DATEDIFF(MONTH, 0, yourTable.Date), 0)
             )
  AND CatID = 32
SELECT  -- Daily Version
  *
FROM
  yourTable
INNER JOIN
(
  SELECT
    Date,
    CatID,
    MAX(Value)   AS max_value
  FROM
    yourTable
  GROUP BY
    CatID,
    Date
)
  AS lookup
    ON  yourTable.Date  = lookup.Date
    AND yourTable.CatID = lookup.CatID
    AND yourTable.Value = lookup.max_value
WHERE
  yourTable.CatID = 32
SELECT  -- Monthly Version
  *
FROM
  yourTable
INNER JOIN
(
  SELECT
    CatID,
    DATEADD(MONTH, DATEDIFF(MONTH, 0, yourTable.Date), 0)   AS month_start,
    MAX(Value)   AS max_value
  FROM
    yourTable
  GROUP BY
    CatID,
    DATEADD(MONTH, DATEDIFF(MONTH, 0, yourTable.Date), 0)
)
  AS lookup
    ON  yourTable.Date  >= lookup.month_start
    AND yourTable.Date  <  DATEADD(MONTH, 1, lookup.month_start)
    AND yourTable.CatID  = lookup.CatID
    AND yourTable.Value  = lookup.max_value
WHERE
  yourTable.CatID = 32