[英]Getting records with month by month, year by year and day by day from SQL Server
我正在寻找一种快速简便的 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
第二:
我想得到同样的但在MONTH 之前。
我怎样才能用 SQL SERVER 做到这一点。 目前是 Sql Server 2012。
同样使用 C# 5,如果你想使用,EF 6。
打倒选民,这个问题成了“热门问题”。 现在请解释为什么投反对票?
下面假设您不仅需要每个日期/月份的最大值,还想知道该行的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
每个PARTITION
按value
降序创建一系列数字(1,2,3,4,etc)
。 值为1
的行是该分区中具有最高值的行。
公式DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0)
只是将Date
四舍五入到月份的第一天,从而为整个月份创建分区。
如果这些行都共享相同的最高值,则其他一些选项会每天/每月带来多行...
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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.