1

MS SQL に 2 つのテーブルがあります。

Category
 - Id (int)

CategoryElement
 - Id (int)
 - CategoryId (int) //References Category.Id
 - Time (datetime)

したがって、各カテゴリには 0 個以上のカテゴリ要素を含めることができます。CategoryElement の Time は、カテゴリ要素が作成された時刻を表します。

過去 7 日間に追加されたカテゴリ要素の数で降順​​でカテゴリを並べ替え、カテゴリ ID と追加された要素の数を表示する、次のクエリを作成する助けが必要です。

これまでのところ、「過去7日間に追加された」部分なしでクエリを書くことができました:

SELECT c.Id, e.ElemCount
FROM dbo.Categories AS c 
INNER JOIN
    (SELECT CategoryId, COUNT(1) AS ElemCount, MAX(Time) AS LatestElem
     FROM dbo.CategoryElements
     GROUP BY CategoryId) AS e 
ON c.ID = e.CategoryId
ORDER BY e.LatestElem DESC
4

6 に答える 6

1

DATEDIFFと句を使用して、WHERE先週だけを取得しTOP 5、結果を5行のみに制限できます。

SELECT TOP 5 c.Id, e.ElemCount
FROM dbo.Categories AS c 
INNER JOIN
    (SELECT CategoryId, COUNT(1) AS ElemCount, MAX(Time) AS LatestElem
     FROM dbo.CategoryElements
     GROUP BY CategoryId) AS e 
ON c.ID = e.CategoryId
WHERE DATEDIFF(d, e.Time, GetDate()) < 7
ORDER BY e.LatestElem DESC

上記の私の答えは、SQLServerの使用を前提としています。データベースの種類によっては、コードが少し変わる場合があります。たとえば、MySQLの場合は次のようになります。

SELECT c.Id, e.ElemCount
FROM dbo.Categories AS c 
INNER JOIN
    (SELECT CategoryId, COUNT(1) AS ElemCount, MAX(Time) AS LatestElem
     FROM dbo.CategoryElements
     GROUP BY CategoryId) AS e 
ON c.ID = e.CategoryId
WHERE (Date(now()) - Date(e.Time)) < 7
ORDER BY e.LatestElem DESC
LIMIT 5
于 2013-03-01T20:41:12.490 に答える
0

次のようなものを見てください:

WHERE (Date(now()) - Date(Time)) < 7
于 2013-03-01T20:40:59.983 に答える
0

使用しているRDBMSはわかりませんが、SQLServerでは次のことができます。

SELECT c.Id, e.ElemCount
FROM dbo.Categories AS c 
INNER JOIN
    (SELECT CategoryId, COUNT(1) AS ElemCount, MAX(Time) AS LatestElem
     FROM dbo.CategoryElements
     WHERE DATEDIFF(d, Time, CURRENT_TIMESTAMP) <= 7
     GROUP BY CategoryId) AS e 
ON c.ID = e.CategoryId
ORDER BY e.LatestElem DESC
于 2013-03-01T20:41:23.010 に答える
0

あなたの「過去7日間」の制限は、あなたの内部が参加しているサブクエリに入ります。そのようです。

SELECT CategoryId, COUNT(1) AS ElemCount, MAX(Time) AS LatestElem
FROM dbo.CategoryElements
WHERE Time > dateadd(dd,-7,getDate()) -- 7 Days prior to today
GROUP BY CategoryId
于 2013-03-01T20:42:58.973 に答える
0

このクエリを試すことができます

SELECT CategoryId, COUNT(*) AS numbOfCat
FROM dbo.CategoryElement
WHERE [Time] BETWEEN DATEADD(day, -7, GETDATE()) AND GETDATE()
GROUP BY CategoryId
ORDER BY MAX(Time) DESC

SQLFiddle のデモ

TOP 5が必要な場合

SELECT TOP 5 CategoryId, COUNT(*) AS numbOfCat
FROM dbo.CategoryElement
WHERE [Time] BETWEEN DATEADD(day, -7, GETDATE()) AND GETDATE()
GROUP BY CategoryId
ORDER BY MAX(Time) DESC
于 2013-03-01T22:45:47.237 に答える
0
select CategoryId, count(*) as cnt
from CategoryElement
where dateadd(day, -7, getdate())<= Time
group by CategoryID
order by   count(*) desc
于 2013-03-01T20:43:38.167 に答える